枚举模板专精
是否可以专门为枚举模板化方法?枚举模板专精
喜欢的东西(以下无效代码):
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>
来完成此操作。
In an answer to one of my questions,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
{
//...
}
}
以上是 枚举模板专精 的全部内容, 来源链接: utcz.com/qa/265459.html