Tengo un conjunto de funciones que se en plantillas tanto por un tipo entero Index
y un tipo de clase T
, que I "parcialmente especializo" de la siguiente manera:La elección de una de instancias de plantilla en tiempo de ejecución, aunque cambiar en C++
// Integer type
enum Index{One,Two,Three,Four};
// Default implementation
template<int I>
struct Foo{
template<typename T> static void bar(const T& x){ std::cout <<"default" << endl; }
};
// Template specializations
template<>
struct Foo<One>{
template<typename T> static void bar(const T& x){ std::cout << "one" << endl; }
};
Esto lo utilizo para seleccionar un índice en particular en el tiempo de ejecución del programa usando una declaración de cambio (que debe resultar en una tabla de búsqueda eficiente). El interruptor es independiente de T
:
template<typename T>
void barSwitch(int k, const T& x){
switch(k){
case ONE: Foo<ONE>::bar(x); break;
case TWO: Foo<TWO>::bar(x); break;
case THREE: Foo<THREE>::bar(x); break;
}
}
Esto funciona bien, por supuesto, pero la clase Foo
no es la única clase en la cual me gustaría solicitar el cambio. De hecho, tengo muchas clases que tienen todas las plantillas con el mismo tipo de entero. Así que me gustaría "plantilla" la clase barSwitch
anterior con la función "Foo" también, para que pueda conectar una clase diferente o una función diferente. La única manera que puedo pensar para lograr esto es utilizar una macro:
#define createBarSwitch(f,b) \
template<typename T> \
void barSwitch(int k, const T& x){ \
switch(k){ \
case ONE: f<ONE>::b(x); break; \
case TWO: f<TWO>::b(x); break; \
case THREE: f<THREE>::b(x); break; \
}\
}
¿Hay alguna forma mejor estilo, más C++ de hacer esto?
Si desea parametrizar por tipo de functor, consulte la discusión de functors aquí: http://stackoverflow.com/q/356950/183203 – antlersoft
Estoy seguro de que se da cuenta de que no puede realizar funciones parcialmente y que está totalmente especializado en el objeto 'Foo', pero tal vez busque en una clase de rasgos o en el modismo int-to-type para elegir la instanciación que desee. Las sobrecargas pueden ser más simples. – AJG85
Correcto, sé que no es realmente una especialización parcial. Solo quise decir que especializo el tipo entero, pero mantengo el tipo 'T' no especificado. – Joel