私はstd::vector<T>
をクラスの一部であり、コード内のさまざまな場所で繰り返し処理する必要があるため、スマートにしてIterateAttributes関数を作成し、それをループ内のboost :: functionオブジェクトに渡して単一の要素を渡してから、要素を処理する関数を渡すことができます。メンバーを反復処理し、引数として渡された関数を呼び出す関数を呼び出す
これは実装するまでは良いアイデアだと思いますが、関数に渡されたものとは何かの問題があり、他の引数が必要です。テンプレートを使うような、より一般的なやり方を見つけなければならないか、あるいは異なるargを取る関数オブジェクトでオーバーロードを作成しなければならないようです。
私は最初の(より一般的な)オプションは多分良いと思いますが、どうすればいいでしょうか?
以下は、動作しない試行ですが、多数の引数を必要とし、属性(構造体)arg以外のすべての引数が必須である場合は試行されます。それについてどうすればいいですか?
template <typename T> template <typename arg>
void ElementNode::IterateAttributes(boost::function<T (arg, Attribute)> func_)
{
std::vector<Attribute>::iterator it = v_attributes.begin();
for (; it != v_attributes.end(); it++)
{
func_(arg, *it);
}
}
あなたは 'boost :: bind'を使って最初に他の引数をバインドしてから' for_each'を使うことができます(本当に別の関数を書く必要がありますか?)。返り値を扱うにはもっと考えが必要です。 – lijie
@lijie:for_eachは、反復処理中の要素を変更することを許可していないと思いましたか? –
ええと...私はあなたが_collection_を変更するはずではないと思いますが、要素自体の変更を禁止するものはないと思います(特に要素の順序は関係ありません)。 – lijie