我有
typedef std::string OrderID;
我想为此重载运算符 ++。OrderID 的值从 1 开始,每次都使用十六进制递增。可能的值是...
001
002
...
00A
00B
...
00F
010
...
1)您可以为特定类型定义重载运算符,以便不重载 std::string++ 吗?
2)你能像上面那样增加(使用十六进制)吗?
谢谢
我有
typedef std::string OrderID;
我想为此重载运算符 ++。OrderID 的值从 1 开始,每次都使用十六进制递增。可能的值是...
001
002
...
00A
00B
...
00F
010
...
1)您可以为特定类型定义重载运算符,以便不重载 std::string++ 吗?
2)你能像上面那样增加(使用十六进制)吗?
谢谢
不,您不能单独进行重载。OrderID
与此上下文中的完全相同std::string
。
如果你定义
OrderID& operator++(OrderID& x)
{
//...
}
它也将适用于std::string
。
您应该改用组合。
您应该使用执行此操作的免费函数,不一定在您定义的类型上。它还可以操纵字符串,这很好。
void incrementString(OrderID& x)
{
//...
}
我想说真正的解决方案是定义一个由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) {...}