Thanks, that was a good read :)
However, my impression is that he’s largely using the existence of templates and polymorphism as arguments that “we don’t really care about type”. I disagree: A template is essentially a generic type description that says something about what types are acceptable. When working with something polymorphic, I’ll prefer ParentClass&
, to indicate what kind of interface I’m working with.
Sure, it can be very useful to hide exact type information in order to generalise the code, but I think that’s a weak argument for hiding all type information by default, which is what auto
does.
To be frank: You gain the information that
MyConcreteType::get<uint32_t>
returns auint32_t
, which I otherwise couldn’t infer from the docs. Of course, I could assume it, based on the template parameter, but I don’t want to go around assuming a bunch of stuff in order to read docs.Take an example like
auto x = my_var.to_reduced_form()
, it’s very clear thatx
is the “reduced form” ofmy_var
, which could be meaningful in itself, but what type is it? I need to know that if I want to do anything withx
. Can I dox += 1
? If I do, will that modifymy_var
? Let’s say I want to make avector
of whateverto_reduced_form
returns… and so on.All these questions are very easily answered by
MyConcreteType x = my_var.to_reduced_form()
. Now I immediately know that everything I can do withmy_var
, I can also do withx
. This makes me happy, because I need to do less digging, and the code becomes clearer to read.