我有一个很大的模板定义(大,因为它超载了大多数操作符),当我需要将它专门化为bool时,我遇到了问题。
虽然所有比较运算符都受到影响,但有一个例子:
template<class T, T min, T max, T init_value = static_cast<T>(0)>
class limited_auto_enum_init
{
...snip...
bool operator == (T v) const { return f_value == v; }
bool operator == (bool v) const { return f_value == v; }
...snip...
};
正如类的名称所暗示的那样,当T来自枚举时,您应该使用它。由于bool
通常被视为枚举,我还想实例化bool
类型的特化:
typedef limited_auto_enum_init<bool, false, true, false> flbool_t;
typedef limited_auto_enum_init<bool, false, true, true> tlbool_t;
当我这样做时,T
为bool
,因此两个函数都具有完全相同的签名。
我调查了SFINAE并想出了类似的东西:
template<class = typename std::enable_if<!std::is_fundamental<T>::value>::type>
bool operator == (T v) const { return f_value == v; }
但bool
告诉我:
错误:'struct std :: enable_if'
中没有名为'type'的类型
对于用户枚举,它可以正常工作。
更新
我找到了一个适合我的解决方案,正如@jrok所指出的那样(虽然标记为解决方案的答案根本没有帮助我!)。我必须定义另一个运算符的返回类型(显式采用bool的那个):
template<class Q = T>
typename std::enable_if<!std::is_fundamental<Q>::value, Q>::type
operator == (bool v) const { return f_value == v; }
这样编译器(g ++)很高兴,失败正如预期的那样。