[Development] Could support for C be added to Qt?
kevin.kofler at chello.at
Sun Sep 11 16:49:45 CEST 2022
samuel ammonius wrote:
> What kind of human error would make converting between the
> pointers dangerous? I've never understood the point of C++
> making pointer types incompatible and then introducing templates
> to bypass this by making a new function for each pointer.
Templates in C++ are much more than hidden casts. (This is quite unlike the
Java generics which are really just syntactic sugar for using Object and
doing casts.) C++ templates really generate different code for different
instantiations, so you can also template on things that are not pointers at
all, you can even do some extent of "duck typing" in that you can call a
method by name and it will find it in the classes you instantiate the
template with, even if those classes do not derive from a common interface,
or the template instantiation will fail if the class has no such method.
(And if the failed declaration is a specialization, it will just silently
fall back to the more generic version, see SFINAE (specialization failure is
not an error), whereas if it is the only available declaration, you will of
course get a compile error if it fails to instantiate.) And through
specializations, you can make the templates do completely different things
for different types (and yes, you can simulate that with the C11 _Generic,
at least in the simple cases).
And in particular, C++ templates can catch type mismatches at compile time
(and even Java generics can do that to some extent), whereas pointer casts
do not catch any mismatch, they just trust you that the type you are casting
to makes sense.
> (I don't see why not use a macro with static casts instead of a
> template though. It would probably double the compile speed, and
> there's no practical way that a human error would happen.)
See above. I could see replacing a Java generic with a macro, at the expense
of type safety, and of course with the issue that Java is normally not run
through a preprocessor, but you cannot in general do that with C++ templates
(also because _Generic is typically *not* available in C++, but it would not
be a full replacement for everything you can do through template
More information about the Development