template generic example c++ templates macros c-preprocessor typename

generic - template class t c++ example



C++ Compare el tipo de plantilla durante el tiempo de compilaciĆ³n (1)

Tengo una clase de plantilla. Dado que las plantillas se procesan durante el tiempo de compilación, ¿es posible comparar el parámetro de la plantilla durante el tiempo de compilación y usar el preprocesador para agregar un código específico? Algo como esto:

template<class T> class MyClass { public: void do() { #if T is equal to vector<int> // add vector<int> specific code #if T is equal to list<double> // add list<double> specific code #else cout << "Unsupported data type" << endl; #endif } };

¿Cómo puedo comparar los tipos de plantilla a otro tipo durante el tiempo de compilación como se muestra en el ejemplo anterior? No quiero agregar subclases específicas que manejen tipos específicos.


Lo primero es lo primero: do es una palabra clave, no puede tener una función con ese nombre.
En segundo lugar, el preprocesador se ejecuta antes de la fase de compilación, por lo que no se puede usar material de las plantillas.

Finalmente, puedes especializar solo una parte de una plantilla de clase, por así decirlo. Esto funcionará:

#include <iostream> #include <vector> #include <list> template<class T> class MyClass { public: void run() { std::cout << "Unsupported data type" << std::endl; } }; template<> void MyClass<std::vector<int>>::run() { // vector specific stuff } template<> void MyClass<std::list<double>>::run() { // list specific stuff }

Demo en vivo.