【发布时间】:2017-07-03 01:40:52
【问题描述】:
根据boost documentation - boost::operators 的正确用法是从中派生:
class A : boost::operators<A>
{
public:
bool operator < (const A&) const { return false; }
};
现在,我可以使用> 和<= 和>=,因为所有这些运算符都可以用< 实现,请参见boost 中的代码sn-p:
template <class T, class B = operators_detail::empty_base<T> >
struct less_than_comparable1 : B
{
friend bool operator>(const T& x, const T& y) { return y < x; }
friend bool operator<=(const T& x, const T& y) { return !static_cast<bool>(y < x); }
friend bool operator>=(const T& x, const T& y) { return !static_cast<bool>(x < y); }
};
最后less_than_comparable1 是boost::operators 基类之一。
问题:
但是添加这样的继承并不总是很方便。例如。这种继承意味着我必须向某些结构添加构造函数,否则所有旧代码,例如 A{1} 都会停止编译:
struct A : boost::operators<A>
{
A() = default;
A(int a, int b = 0) : a(a), b(b) {}
int a;
int b;
};
bool operator < (const A&, const A&);
我尝试了几种方法:内部类,boost::operators<A> 的静态成员,但似乎只有继承有效。
我接受一个答案,该答案显示了如何在没有继承的情况下使用 boost::operators。
我也可以接受一个答案,它解释了为什么需要这种继承。
好的,让我们稍微简化一下这个例子,为什么我需要在下面这个例子中继承才能从operator < 获取operator >?
template <typename A>
struct GtOperator
{
friend bool operator > (const A& l, const A& r)
{
return r < l;
}
};
struct A : private GtOperator<A>
{
bool operator < (const A&) const
{
return false;
}
};
int main() {
if (A{} > A{})
{
return -1;
}
}
似乎没有其他工作,例如这种方式行不通:
struct A
{
GtOperator<A> dummy;
bool operator < (const A&) const
{
return false;
}
};
【问题讨论】:
-
要么手动写出来,要么写一个预处理器宏。 (只有六个运算符,无论如何你必须写
operator >。写operator ==通常也很有用。) -
@MartinBonner
boost::operators提供的远不止这 3 个。我只想知道如果可能的话,如何在没有继承的情况下使用它。或者知道为什么需要继承 -
@jaggedSpire 在 boost::operators 中没有对子类的强制转换。来自
less_than_comparable1的只有这样的朋友运营商 - 没有向下转换。这就是为什么我要问为什么这里需要继承?
标签: c++ templates inheritance boost operators