如果T不是基础,我该如何重载运算符?

时间:2014-06-06 19:01:14

标签: c++ templates operator-overloading sfinae

我有一个很大的模板定义(大,因为它超载了大多数操作符),当我需要将它专门化为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;

当我这样做时,Tbool,因此两个函数都具有完全相同的签名。

我调查了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 ++)很高兴,失败正如预期的那样。

0 个答案:

没有答案