是否可以为枚举专门化一个模板化的方法?
类似(下面的无效代码):
template <typename T>
void f(T value);
template <>
void f<enum T>(T value);
如果不可能,那么假设我有多种类型的专业化,例如int
,unsigned int
,long long
,unsigned long long
等,那么枚举值将使用的专业化?
答案 0 :(得分:20)
您可以std::enable_if
使用<type_traits>
{{1}}来完成此操作。
std::is_enum
,litb发布了非常详细而且写得很好的解释,说明如何使用Boost等效项。
答案 1 :(得分:7)
我不确定我是否正确理解了您的问题,但您可以在特定枚举上实例化模板:
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);
}
答案 2 :(得分:1)
据推测,你可以用一种他们唯一知道的类型做的唯一有趣的事情就是它是一个枚举,将它转换为它的基础类型并对其进行操作。使用James&#39;在这里看起来如何。建议的方法(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
{
//...
}
}
答案 3 :(得分:0)
您还可以在模板参数之一中使用 std::enable_if
。
如果无法编译,则根本不会实例化该函数(SFINAE)。
template <typename T>
void f(T value)
{ /* implementation A */ }
template <typename T,
typename = std::enable_if<std::is_enum<T>::value, bool>::type >
void f(T value)
{ /* implementation B */ }
我提出上述解决方案是对建议您使用 std::enable_if
作为返回类型的解决方案的补充,如果您的函数。在您的问题中,您不希望更改返回类型。