【发布时间】:2018-05-11 13:09:03
【问题描述】:
我定义了一个IntWrapper 类,如下所示:
struct IntWrapper
{
protected:
int value;
public:
explicit IntWrapper() = default;
explicit IntWrapper(const int value) : value(value) {}
bool operator< (const IntWrapper rhs) const { return value < rhs.value; }
bool operator> (const IntWrapper rhs) const { return value > rhs.value; }
bool operator<=(const IntWrapper rhs) const { return value <= rhs.value; }
bool operator>=(const IntWrapper rhs) const { return value >= rhs.value; }
bool operator==(const IntWrapper rhs) const { return value == rhs.value; }
explicit operator int() const { return value; }
};
以及继承自 IntWrapper 的类 Foo 和 Bar
struct Foo: IntWrapper
{
using IntWrapper::IntWrapper;
};
struct Bar: IntWrapper
{
using IntWrapper::IntWrapper;
};
我只想比较相同类型的对象。换句话说,我希望下面的代码给出编译错误,而不是将 foo 和 bar 转换为 IntWrapper。
const Foo foo(1);
const Bar bar(2);
bool b = foo >= bar;
由于我有许多其他对象,例如 Foo 和 Bar,有什么方法可以实现我的结果,将所有比较运算符保留在 IntWrapper 中?
【问题讨论】:
-
只是您想要禁止的比较吗?您是否可以向 IntWrapper 添加“无用”模板参数,这会使它们成为不同的基础,因为您最终会拥有:
struct Foo : IntWrapper<Foo> -
像 Bar 和 Foo 这样的声音不是 IntWrapper,但应该包含 IntWrapper。
-
@UKMonkey 如果你这样做,你必须为每个类中的运算符实现接口(即使它们只是转发到 intwrapper)我假设这是 OP 试图避免的?