模板专业化,枚举(Template specialization for enum)

2019-09-01 01:38发布

是否有可能专门为枚举了模板化的方法?

喜欢的东西(以下无效代码):

template <typename T>
void f(T value);

template <>
void f<enum T>(T value);

在这种情况下这是不可能的,那么假如我有专业化的多种类型,如intunsigned intlong longunsigned long long ,等等,那么其专业化的枚举值将使用?

Answer 1:

您可以使用std::enable_ifstd::is_enum<type_traits>做到这一点。

在回答我的问题之一 ,litb贴出了这可以如何使用Boost等价物做了非常详细和书面解释。



Answer 2:

我不知道如果我正确地理解你的问题,但你可以实例化具体枚举模板:

template <typename T>
void f(T value);

enum cars { ford, volvo, saab, subaru, toyota };
enum colors { red, black, green, blue };

template <>
void f<cars>(cars) { }

template <>
void f<colors>(colors) { }

int main() {
    f(ford);
    f(red);
}


Answer 3:

想必,你可以和你了解它,他们唯一的一个类型做的唯一有趣的事情是,它是一个枚举,是将它转换为它的基本类型,并在该操作。 以下是如何可能的样子,用詹姆斯的建议的方法(AKA SFINAE ):

void Bar(int b); // and/or other underlying types

template<typename T>
typename std::enable_if<std::is_enum<T>::value, void>::type
Foo(T enm)
{
    Bar(static_cast<typename std::underlying_type<T>::type>(enm));
}

作为一个相关的奖金,这里有一个类似的方法,只会得到解决特定类型的选择(以取代布尔的is_same到您选择的类型):

template<typename T>
typename std::enable_if<std::is_same<T,bool>::value, void>::type
Baz(T bl)
{
    if (bl)
    {
        //...
    }
    else
    {
        //...
    }
}


文章来源: Template specialization for enum