簡體   English   中英

C ++中類型定義的重載運算符

[英]Overload Operator for Type Define in C++

我有

typedef std::string OrderID;

我想為此重載運算符++。 OrderID的值從1開始,每次都使用十六進制遞增。 可能的值是...

001

002

...

00A

00B

...

00F

010

...

1)您可以重載特定類型定義的運算符,以便不重載std :: string ++嗎?

2)您可以像上面那樣增加(使用十六進制)嗎?

謝謝

不,您不能單獨進行重載。 在這種情況下, OrderIDstd::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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM