Las funciones de miembros virtuales se instancian cuando se crea una instancia de una plantilla de clase, pero las funciones de miembros no virtuales se crean instancias solo si se invocan.
Esto está cubierto en [temp.inst] en el estándar C++ (En C++ 11, esto es §14.7.1/10. En C++ 14, es §14.7.1/11, y en C++ 17 es §17.7.1/9. Extracto de C++ 17 a continuación)
una implementación no se instanciar implícitamente una plantilla de función, una plantilla de variables, una plantilla miembro , un no virtual función miembro, miembro de una clase, un miembro de datos estático de una plantilla de clase, o un substatement de un constexpr
si, a menos que se requiere una declaración (9.4.1) tal ejemplificación
También tenga en cuenta que es posible instanciar una plantilla de clase incluso si algunas de las funciones miembro no son instanciables para los parámetros de plantilla dados. Por ejemplo:
template <class T>
class Xyzzy
{
public:
void CallFoo() { t.foo(); } // Invoke T::foo()
void CallBar() { t.bar(); } // Invoke T::bar()
private:
T t;
};
class FooBar
{
public:
void foo() { ... }
void bar() { ... }
};
class BarOnly
{
public:
void bar() { ... }
};
int main(int argc, const char** argv)
{
Xyzzy<FooBar> foobar; // Xyzzy<FooBar> is instantiated
Xyzzy<BarOnly> baronly; // Xyzzy<BarOnly> is instantiated
foobar.CallFoo(); // Calls FooBar::foo()
foobar.CallBar(); // Calls FooBar::bar()
baronly.CallBar(); // Calls BarOnly::bar()
return 0;
}
Esto es válido, a pesar de que Xyzzy :: CallFoo() no es instanciable porque no hay tal cosa como BarOnly :: foo(). Esta característica se usa a menudo como una herramienta de metaprogramación de plantillas.
Tenga en cuenta, sin embargo, que la "instanciación" de una plantilla no se correlaciona directamente con la cantidad de código objeto que se genera. Eso dependerá de su implementación de compilador/vinculador.
También debemos tener en cuenta que no todas las funciones se pueden instanciar y esto está bien siempre y cuando no se llamen. –
Hecho. Pensé en eso cuando respondí inicialmente, pero era demasiado flojo para escribir una explicación completa. –
¿Es posible marcar el método para crear una instancia de fuerza (es decir, evitar que se optimice) sin hacerlo virtual? Gracias! – Serge