私の問題はかなり単純です。文字列を返すメソッドを持つオブジェクトの動的配列があります。これらすべての文字列を連結したい。
文字列を返すメソッドを持つオブジェクトの代わりに文字列の配列がある場合、これは簡単な作業になります。
std::vector<std::string> v{ "f", "o", "o" };
std::string const x = std::accumulate(v.begin(), v.end(), std::string());
しかし、私の場合はむしろ次のようになります。
struct foo
{
foo(std::string const & name) : name_(name) {}
std::string const & name() const { return name_; }
private:
std::string const name_;
};
std::vector<foo> v{ foo("f"), foo("o"), foo("o") };
標準ライブラリのアルゴリズムは効率的であり、デバッグする必要がないと確信しているため、標準ライブラリのアルゴリズムを使用したいと思いますが、これは読みにくく、理解するのが難しすぎます。
std::vector<std::string> transformed(v.size());
std::transform(v.begin(), v.end(), transformed.begin(),
[](foo const & f) { return f.name(); });
std::string const x = std::accumulate(transformed.begin(), transformed.end(),
std::string());
将来のメンテナはおそらく (そして当然のことながら) 私を追い詰めて、簡単なタスクを不必要に複雑にしたことで顔を殴りつけるでしょう。
std::string x;
for(auto const & f : v)
x += f.name();
ここで私が見ていない簡単なものはありますか、それとも標準ライブラリを休ませて for ループを使用する必要がある場合ですか?