我有
typedef std::string OrderID;
我想为此重载operator ++。 OrderID的值从1开始,每次都使用十六进制递增。可能的值是......
001
002
...
00A
00B
...
00F
010
...
1)您是否可以为特定类型定义重载运算符,以便std :: string ++不会重载?
2)你能像上面那样增加(使用Hex)吗?
由于
答案 0 :(得分:2)
不,你不能单独过载。在这种情况下,OrderID
与std::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) {...}