[英]Overload Operator for Type Define in C++
我有
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
所有用戶公開OrderId::find_last_not_of(...)
方法是一個好主意嗎?
更好地編寫它,並使其類型安全:
class OrderId {
public:
...
foo frob () const {
... rawData_ ...
}
OrderId& operator++(); // prefix
OrderId operator++(int); // postfix
private:
std::string rawId_;
};
並按照YAGNI進行操作。 保持接口小是可重用,可維護和健壯的代碼的絕妙秘訣,而這些代碼與客戶端代碼並沒有太多關聯。
還有:只有在有意義的情況下重載運算符,您的客戶才應該能夠立即解釋遞增order-id的含義。 例如,增加整數是有意義的,增加統計計數器是有意義的,但是增加汽車卻沒有意義。 因此,走最小的方式,然后重新考慮operator++
是否完全有意義,或者是否應該使用命名函數代替,例如:
OrderId successor (OrderId oid) {...}
OrderId predecessor (OrderId oid) {...}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.