Выбор экземпляра шаблона во время выполнения с помощью переключателя в C ++

У меня есть набор функций, которые шаблонизируются как целочисленным типом Индексом , так и типом класса 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 ++?

5
задан Joel 16 February 2012 в 22:23
поделиться