Моя платформа — Windows с Visual Studio Express 2012.
У меня есть шаблонный метод следующим образом
struct A
{
template<class T> void blub(T value);
};
Я хочу иметь несколько специализаций, например:
template<> void A::blub(std::string value) { /* ... */ }
template<> void A::blub(int value) { /* ... */ }
Однако теперь я хотел бы включить перечисления, как-то так:
enum MyEnum { ENUM_1 };
A a;
a.blub(ENUM_1);
Это, конечно, не работает, потому что для этого типа нет специализации. Я не знаю точное перечисление заранее, поэтому я хотел бы получить специализацию шаблона для перечислений в целом.
Выполнение чего-то вроде следующего приведет к сбою компиляции:
template<class T> void A::blub(const typename std::enable_if<std::is_enum<T>::value, T>::type& value) { /* ... */ }
Компилятор завершается с ошибкой C2244. Это имеет смысл, потому что компилятор вообще не может вывести тип для этого метода.
Что приводит меня к выводу: то, что я хочу, невозможно. Для вышеуказанного вызова мне нужно было бы сделать следующее:
A a;
a.blub((int)ENUM_1);
Верен ли мой вывод? Я просто должен сделать бросок в вызове? Обходным путем может быть шаблон класса, но я не хочу этого делать, потому что класс делает много других вещей помимо этого метода.