我有一个看起来像这样的课程:
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;。
答案 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,那么你需要使用模板元函数而不是普通函数/重载运算符。