是否可以为枚举专门化一个模板化的方法?

类似(下面的无效代码):

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

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

如果不可能,那么假设我有多种类型的专业化,如intunsigned intlong longunsigned long long等,那么枚举值将使用哪些特化?

有帮助吗?

解决方案

您可以使用 std::enable_if ://en.cppreference.com/w/cpp/types/is_enum“rel =”nofollow noreferrer“> std::is_enum 来自<type_traits>来完成此任务。

在回答中对于我的一个问题,litb发布了一个非常详细而且写得很好的解释,说明如何使用Boost等效项。

其他提示

我不确定我是否正确理解了您的问题,但您可以在特定枚举上实例化模板:

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);
}

据推测,你可以用一种他们唯一知道的类型做的唯一有趣的事情就是它是一个枚举,将它转换为它的基础类型并对其进行操作。以下是使用James建议的方法(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中的bool替换为您选择的类型):

template<typename T>
typename std::enable_if<std::is_same<T,bool>::value, void>::type
Baz(T bl)
{
    if (bl)
    {
        //...
    }
    else
    {
        //...
    }
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top