【发布时间】:2016-08-14 19:19:24
【问题描述】:
是否可以在 enum 上专门化模板函数?
我已经注意到 here 一个模板函数可以被禁用,如果它不是一个枚举,但这是否可能同时仍然允许其他类型?
下面的示例显示了int、float 和enum 的特化(它无法编译,因为它试图重载enum 版本而不是特化它)。我觉得我遗漏了一些明显的东西。
请注意,我希望专注于 any 枚举,而不仅仅是一个命名的枚举(示例中为EAnEnum)
#include <iostream>
enum class EAnEnum
{
Alpha,
Beta,
};
template<typename T>
void MyFunc();
template<>
void MyFunc<int>()
{
std::cout << "Int" << std::endl;
}
template<>
void MyFunc<float>()
{
std::cout << "Float" << std::endl;
}
// MyFunc<Enum>
template<typename T>
typename std::enable_if<std::is_enum<T>::value, void>::type MyFunc()
{
std::cout << "Enum" << std::endl;
}
int main()
{
MyFunc<EAnEnum>();
return 0;
}
【问题讨论】:
-
您正在尝试执行函数模板的部分特化。没有这样的事情——你可以做完全的专业化,或者重载。一种可能的方法 - 将您的特定于枚举的实现放入主模板中,可能带有
static_assert,该类型实际上是一个枚举。 -
您要解决的实际问题是什么。不,不是这个问题,而是你认为答案是这种专业化的问题。
-
一般来说,函数专业化并不是解决几乎所有你试图用它解决的问题的最佳方法。简而言之,会有更好的方法。解决方案最终变得脆弱而尴尬。描述真正的问题,用另一种方式解决它。
-
我在流上使用
>>运算符,我想专门使用它来读取不同于文件中整数的枚举,而不必脱离my_stream >> x >> y >> z;模式,作为@ 987654332@,ReadEnum()模式需要。我事先不知道枚举的类型。我同意可能有更好的解决方案,但这个问题仍然是一个思考练习:)
标签: c++ templates c++11 enums specialization