У меня есть набор функций, которые шаблонизируются как целочисленным типом Индексом
, так и типом класса T
, которые я «частично специализирую» следующим образом:
// 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; }
};
Я использую его для выбора определенного индекса во время выполнения программы с помощью оператора switch (который должен привести к эффективной таблице поиска). Переключатель не зависит от 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;
}
}
Это, конечно, работает нормально, но класс Foo
- не единственный класс, для которого я хотел бы применить переключатель. На самом деле, у меня есть много классов, которые основаны на одном и том же целочисленном типе. Поэтому я хотел бы "шаблон" класса barSwitch
выше с функцией "Foo", чтобы я мог подключить другой класс или другую функцию. Единственный способ, который я могу придумать для этого, - использовать макрос:
#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; \
}\
}
Есть ли какой-нибудь лучший способ сделать это в стиле C ++?