是否有可能专门为枚举了模板化的方法?
喜欢的东西(以下无效代码):
template <typename T>
void f(T value);
template <>
void f<enum T>(T value);
在这种情况下这是不可能的,那么假如我有专业化的多种类型,如int
, unsigned int
, long long
, unsigned long long
,等等,那么其专业化的枚举值将使用?
是否有可能专门为枚举了模板化的方法?
喜欢的东西(以下无效代码):
template <typename T>
void f(T value);
template <>
void f<enum T>(T value);
在这种情况下这是不可能的,那么假如我有专业化的多种类型,如int
, unsigned int
, long long
, unsigned long long
,等等,那么其专业化的枚举值将使用?
您可以使用std::enable_if
用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);
}
想必,你可以和你了解它,他们唯一的一个类型做的唯一有趣的事情是,它是一个枚举,是将它转换为它的基本类型,并在该操作。 以下是如何可能的样子,用詹姆斯的建议的方法(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
{
//...
}
}