使用boost ::运算符定义模板类的运算符

时间:2012-02-20 10:34:22

标签: c++ boost

我有一个看起来像这样的课程:

template<int DIGITS, int FRACTIONS>
class decimal{

    bool operator<(const int& rhs) const;

    template<int RDIGITS, int RFRACTIONS>
    bool operator<(const decimal<RDIGITS, RFRACTIONS>& rhs) const;
}

我应该可以使用

添加int的相关比较运算符
class decimal : boost::less_than_comparable<fixed_decimal<DIGITS, DECSIZE>, int>{ }

但是如何将less_than_comparable与其他十进制模板一起使用? 我希望能够比较十进制&lt; 10,5&gt;例如,小数&lt; 6,4&gt;。

2 个答案:

答案 0 :(得分:0)

我认为由于C ++编译器扩展模板的方式,这是不可能的。您必须为每个<DIGITS, DECSIZE> - 组合定义运算符。在你的位置,我采用动态方法,并将这两个参数作为类的成员变量而不是模板参数。

答案 1 :(得分:0)

对于返回固定类型(例如bool)的运算符,您可以手动实现运算符:

template <int N1, unsigned D1, int N2, unsigned D2>
bool operator <(fraction<N1, D1>, fraction<N2, D2>) {
    // Normalisation omitted, using floating point arithmetic
    return (static_cast<float>(N1) / D1) < (static_cast<float>(N2) / D2);
}

(当然,有更聪明的方法来进行比较。)

但是一旦你涉及更复杂的算术表达式领域,例如operator +,就不能再这样做了,因为返回类型依赖于(截至未知)模板参数。

可以在C ++ 11中执行以下操作:

template <int N1, unsigned D, int N2>
constexpr auto operator +(fraction<N1, D>, fraction<N2, D>)
    -> fraction<N1 + N2, D>
{
    return fraction<N1 + N2, D>();
}

...并调用:

fraction<1, 2> a;
fraction<3, 2> b;
auto c = a + b;

如果你不能使用C ++ 11,那么你需要使用模板元函数而不是普通函数/重载运算符。