私は持っています
typedef std::string OrderID;
このために演算子++をオーバーロードしたいと思います。OrderIDの値は1から始まり、毎回16進数を使用して増分されます。可能な値は...
001
002
..。
00A
00B
..。
00F
010
..。
1)std :: string ++がオーバーロードされないように、特定のタイプ定義の演算子をオーバーロードできますか?
2)上記のように(16進数を使用して)インクリメントできますか?
ありがとう
私は持っています
typedef std::string OrderID;
このために演算子++をオーバーロードしたいと思います。OrderIDの値は1から始まり、毎回16進数を使用して増分されます。可能な値は...
001
002
..。
00A
00B
..。
00F
010
..。
1)std :: string ++がオーバーロードされないように、特定のタイプ定義の演算子をオーバーロードできますか?
2)上記のように(16進数を使用して)インクリメントできますか?
ありがとう
いいえ、個別にオーバーロードすることはできません。このコンテキスト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 に従ってください。インターフェースを小さく保つことは、再利用可能で保守可能で堅牢なコードを作成する最大の秘訣であり、クライアント コードとはあまり関係がありません。
また、意味がある場合にのみ演算子をオーバーロードします。クライアントは、オーダー ID のインクリメントが何を意味するのかをすぐに説明できるはずです。たとえば、整数をインクリメントするのは理にかなっており、統計カウンターをインクリメントするのは理にかなっていますが、車をインクリメントするのは意味がありません。operator++したがって、驚きを最小限に抑える方法をとって、意味があるかどうか、または代わりに名前付き関数を使用する必要があるかどうかを再考 してください。
OrderId successor (OrderId oid) {...}
OrderId predecessor (OrderId oid) {...}