On Mon, Nov 09, 2009 at 10:56:29PM +1100, William Leslie wrote: > [templates] really are compile-time code generation.
Yes, they must be because compiled code doesn't know about types. So the linker cannot choose the proper function depending on the type: it doesn't know about types. The reason languages like Python an javascript can do this, is that they are interpreted languages, so that compile-time is the same as run-time (Python-"compiling" is only optimizing). > This means that two compilation units that use minimum<int> will each > have their own instance of it. But there is a solution to that, which is implemented in C++: think make each instance a weak symbol, which may be multiply defined. If it is, only one function is actually included at link time. Also, you can include certain instantiations of the template in the library. If the compiler needs it, it will call the library function instead of creating its own. I think this may be what Antrik was referring to: you can explicitly tell the compiler to instantiate the template for a certain type. This is only needed when building a library, where you want the instance without using it. When a template is used, the instance is automatically created. > It seems like it would be difficult to reason about how much > duplication would occur in a largeish project. Because of the two methods above, there is no code duplication at all. > Worse, because you can't put them into a library and have template > parameters resolved at link time, changes to templates require > rebuilding all the code that uses them. It's a very inconvenient way > to achieve code reuse IMHO. This is true, indeed (if the code that uses them instantiates the template, and it usually does). But there is no way to achieve this, because a precompiled library is incapable of resolving types. So it doesn't get better than this. If this is not good enough, then you'll have to live without templates. Appearantly you do, and I did as well, but I'm very happy that I don't have to anymore. :-) You do have a point about the error messages though. It still shows that C++ was originally just a C preprocessor. Some errors can only be understood if you know how the feature is implemented. Thanks, Bas
signature.asc
Description: Digital signature
