0

私は持っています

typedef std::string OrderID;

このために演算子++をオーバーロードしたいと思います。OrderIDの値は1から始まり、毎回16進数を使用して増分されます。可能な値は...

001

002

..。

00A

00B

..。

00F

010

..。

1)std :: string ++がオーバーロードされないように、特定のタイプ定義の演算子をオーバーロードできますか?

2)上記のように(16進数を使用して)インクリメントできますか?

ありがとう

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 に従ってください。インターフェースを小さく保つことは、再利用可能で保守可能で堅牢なコードを作成する最大の秘訣であり、クライアント コードとはあまり関係がありません。

また、意味がある場合にのみ演算子をオーバーロードします。クライアントは、オーダー ID のインクリメントが何を意味するのかをすぐに説明できるはずです。たとえば、整数をインクリメントするのは理にかなっており、統計カウンターをインクリメントするのは理にかなっていますが、車をインクリメントするのは意味がありません。operator++したがって、驚きを最小限に抑える方法をとって、意味があるかどうか、または代わりに名前付き関数を使用する必要があるかどうかを再考 してください。

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