Можно ли специализировать функцию шаблона на enum
?C++ specialize function on enum
Я видел отмечен here Функция шаблона может быть отключена, если она не является перечислением, но возможно ли это, хотя она позволяет другие типы?
Мой пример ниже показывает специализации для int
, float
и enum
(он не компилируется, потому что он пытается перегрузить версию enum
, а не специализирующийся его). Я чувствую, что мне не хватает чего-то очевидного.
Обратите внимание, что я ищу специализироваться на любой перечисление, а не только по имени один (EAnEnum
в примере)
#include <iostream>
enum class EAnEnum
{
Alpha,
Beta,
};
template<typename T>
void MyFunc();
template<>
void MyFunc<int>()
{
std::cout << "Int" << std::endl;
}
template<>
void MyFunc<float>()
{
std::cout << "Float" << std::endl;
}
// MyFunc<Enum>
template<typename T>
typename std::enable_if<std::is_enum<T>::value, void>::type MyFunc()
{
std::cout << "Enum" << std::endl;
}
int main()
{
MyFunc<EAnEnum>();
return 0;
}
Вы пытаетесь выполнить частичную специализацию шаблона функции. Нет такой вещи - вы можете заниматься полной специализацией или перегрузкой. Один из возможных подходов - перевести вашу специфичную для перечисления реализацию в первичный шаблон, возможно, с помощью 'static_assert', который на самом деле является перечислением. –
Какую актуальную проблему вы пытаетесь решить. Нет, не этот вопрос, но проблема, на которую, по вашему мнению, ответ на этот вид специализации. –
Специализация в целом не может быть лучшим способом решить практически любую проблему, которую вы пытаетесь решить с ней. Короче говоря, будет лучший способ. Решения становятся хрупкими и неудобными.Опишите настоящую проблему, решите ее по-другому. – Yakk