在C ++中使用Type定义的重载运算符

时间:2012-06-26 13:53:18

标签: c++ operator-overloading hex

我有

typedef std::string OrderID;

我想为此重载operator ++。 OrderID的值从1开始,每次都使用十六进制递增。可能的值是......

001

002

...

00A

00B

...

00F

010

...

1)您是否可以为特定类型定义重载运算符,以便std :: string ++不会重载?

2)你能像上面那样增加(使用Hex)吗?

由于

3 个答案:

答案 0 :(得分:2)

不,你不能单独过载。在这种情况下,OrderIDstd::string完全相同。

答案 1 :(得分:2)

如果你定义

OrderID& operator++(OrderID& x)
{
     //...
}

它也适用于std::string

您应该使用组合

你应该使用一个免费的功能,不一定是你定义的类型。它也可以操纵一个字符串,这很好。

void incrementString(OrderID& x)
{
  //...
}

答案 2 :(得分:2)

我认为真正的解决方案是定义一个由std::string和/或其他类型组成的新类型,然后只公开与Order-Id类的接口相关的内容< / em>的

例如,您是否真的认为向OrderId::find_last_not_of(...)的所有用户公开方法OrderId是一个好主意?

更好地构建它,并使其类型安全:

class OrderId {
public:
    ...
    foo frob () const { 
        ... rawData_ ...
    }

    OrderId& operator++();    // prefix
    OrderId  operator++(int); // postfix

private:
    std::string rawId_;
};

并按照YAGNI的说明进行操作。保持接口较小是可重用,可维护且功能强大的代码的首要秘密,这些代码与客户端代码不相关。

而且:只有重载操作符才有意义,您的客户应该能够立即解释订单ID增加的含义。例如,增加整数是有意义的,增加统计计数器是有意义的,但增加汽车是没有意义的。所以,采用最不可取的方式,重新考虑operator++是否有意义,或者是否应该使用命名函数,例如:

OrderId successor (OrderId oid) {...}
OrderId predecessor (OrderId oid) {...}