バックグラウンド
内部で vector<std::string> を使用するコンテナ クラスがあります。内部ベクトルに対してpush_back()を実行するメソッドAddChar(std::string)をこのラッパー クラスに提供しました。私のコードでは、コンテナに複数のアイテムを追加する必要があります。そのために私は使用しなければなりません
container.AddChar("First");
container.AddChar("Second");
これにより、コードが大きくなります。そのため、より簡単にするために、演算子 << をオーバーロードする予定です。書けるように
container << "First" << "Second"
2 つのアイテムが基になるベクターに追加されます。
これが私がそのために使用したコードです
class ExtendedVector
{
private:
vector<string> container;
public:
friend ExtendedVector& operator<<(ExtendedVector& cont,const std::string str){
cont.AddChar(str);
return cont;
}
void AddChar(const std::string str)
{
container.push_back(str);
}
string ToString()
{
string output;
vector<string>::iterator it = container.begin();
while(it != container.end())
{
output += *it;
++it;
}
return output;
}
};
期待どおりに動作しています。
質問
- 演算子のオーバーロードは正しく記述されていますか?
- このような状況で演算子をオーバーロードすることは良い習慣ですか?
- このコードにパフォーマンスの問題やその他の問題はありますか?
何かご意見は?
編集
優れたコメントを聞いた後、<< をオーバーロードしないことにしました。ここでは意味がありません。演算子のオーバーロード コードを削除しました。これが最終的なコードです。
class ExtendedVector
{
private:
vector<string> container;
public:
ExtendedVector& AddChar(const std::string str)
{
container.push_back(str);
return *this;
}
.. other methods
}
これにより、追加できます
container.AddChar("First").AddChar("Second")
C# では、params キーワードを使用してこれをより簡単に行うことができます。コードは次のようになります
void AddChar(params string[] str)
{
foreach(string s in str)
// add to the underlying collection
}
C++ では、...を使用してパラメーターの可変長を指定できることを知っています。しかし、知る限り、タイプセーフではありません。そうすることは推奨される方法ですか?書けるように
container.AddChar("First","Second")
返信ありがとうございます。