特定の要素のロジックが現在のインデックスに依存するため、std::for_each を使用できないことがよくあります。そのために、メインのファンクターをラップして現在のインデックスを渡すファンクター クラスを発明しました。理想的には、ラムダ式で使用したいと考えています。私が作成したクラスは安全で効果的ですか? より良い解決策はありますか?ラッパーの演算子 () がラムダ式の型を返すようにしたかったのですが、それがわかりませんでした。また、インデックスにはどのタイプを使用すればよいですか? メイン ファンクターを値または参照でラッパーに格納する必要がありますか?
ありがとう!
template<class FUNC>
class IndexFunctor
{
public:
typedef FUNC FUNC_T;
explicit IndexFunctor(const FUNC_T& func) : func(func), index(0) {}
// how can this return the return type of func?
template<class T>
void operator ()(T& param)
{
func(index++, param);
}
const FUNC_T& GetFunctor() const
{
return func;
}
int GetIndex() const
{
return index;
}
void SetIndex(int index)
{
this->index = index;
}
private:
FUNC_T func;
int index;
};
template<class FUNC>
IndexFunctor<FUNC> with_index(const FUNC& func)
{
return IndexFunctor<FUNC>(func);
}
void somefunc()
{
std::vector<int> v(10);
std::for_each(v.begin(), v.end(), with_index([](int index, int x){ std::cout << "[" << index << "]=" << x << std::endl; }));
}