0

我有

typedef std::string OrderID;

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

001

002

...

00A

00B

...

00F

010

...

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

2)你能像上面那样增加(使用十六进制)吗?

谢谢

4

3 回答 3

2

不,您不能单独进行重载。OrderID与此上下文中的完全相同std::string

于 2012-06-26T13:56:14.837 回答
2

如果你定义

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

它也将适用于std::string

您应该改用组合

您应该使用执行此操作的免费函数,不一定在您定义的类型上。它还可以操纵字符串,这很好。

void incrementString(OrderID& x)
{
  //...
}
于 2012-06-26T13:56:51.467 回答
2

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

例如,您真的认为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 的接口。保持接口小是可重用、可维护和健壮的代码的第一大秘诀,它与客户端代码的耦合度不高。

And also: Only overload operators if it makes sense, your clients should immediately be able to explain what incrementing an order-id means. E.g., it makes sense to increment integers, it makes sense to increment statistical counters, but it wouldn't make sense to increment cars. So, go the way of least suprise, and re-think whether operator++ makes sense at all, or if you should use a named function instead, e.g.:

OrderId successor (OrderId oid) {...}
OrderId predecessor (OrderId oid) {...}
于 2012-06-26T14:02:36.023 回答