类方法上的C++类型特征:如果参数为枚举,则部分专用化
C++ typetraits on class method: partial specialization if parameter is enum
>我的平台是带有Visual Studio Express 2012的Windows。
我有一个模板化方法如下
struct A
{
template<class T> void blub(T value);
};
我想有几个专业,如下所示:
template<> void A::blub(std::string value) { /* ... */ }
template<> void A::blub(int value) { /* ... */ }
但是,现在我想包含枚举,以某种方式如下所示:
enum MyEnum { ENUM_1 };
A a;
a.blub(ENUM_1);
当然,这失败了,因为没有针对该类型的专用化。我不知道提前精确枚举,所以我想为一般的枚举派生一个模板专用化。
执行以下操作将使编译失败:
template<class T> void A::blub(const typename std::enable_if<std::is_enum<T>::value, T>::type& value) { /* ... */ }
编译器失败,并显示 C2244。这是有道理的,因为编译器通常无法推断该方法的类型。
这让我得出结论:我想要的是不可能的。对于上述调用,我必须执行以下操作:
A a;
a.blub((int)ENUM_1);
我的结论对吗?我只需要在电话中做演员吗?解决方法是模板化类,但我不想这样做,因为除了该方法之外,该类确实执行了许多其他操作。
您尝试部分专用化函数模板 - 这是不允许的。改为在返回类型上执行此操作:
struct A
{
template<typename T>
typename std::enable_if<std::is_enum<T>::value>::type
blub(T value);
// and don't specialize for concrete types,
// just overload:
void blub(std::string value);
void blub(int value);
};
活生生的例子。
相关文章:
- 不带大括号的枚举形式
- 枚举环境变量的惯用C++14/C++17方法
- 类似枚举的计算常量
- 如何正确实现和访问运算符的各种自定义枚举器
- 错误:从"int"到枚举c++的转换无效
- C++中构造函数中的枚举
- 访问在 C++ 结构中声明的枚举变量
- 枚举类'classname'的多重定义
- 强枚举类型定义:Clang Bug 还是 C++11 标准不确定性?
- typedef 枚举和枚举类有什么区别?
- 基于枚举参数调用专用模板方法
- 在模板类内部定义的枚举上的嵌套类的部分专用化
- 如何部分专用化枚举值的类模板?
- 如何为所有枚举部分专用化类模板
- 使用专用模板并命名枚举选项
- C++模板专用化,类作为返回类型,枚举作为参数
- 枚举类型参数的专用成员模板
- 类方法上的C++类型特征:如果参数为枚举,则部分专用化
- 专用模板根据变量类型返回/设置枚举值
- 跟踪专用模板对象的枚举成员值