2016-08-27 6 views
3

範囲内の各数値に指定された値を掛け、必要に応じてファンクタを使用して乗算する数値への参照を取得すると想定します。入力パラメータへの参照を返すC++ファンクタ

template <typename TIter, typename TNumber, typename TTransformer = self_reference<iterator_traits<TIter>::value_type>> 
void multiply_range(TIter begin, TIter end, TNumber multiplicand, TTransformer transformer = TTransformer()) { 
    for_each(begin, end, [multiplicand, &transformer](typename iterator_traits<TIter>::value_type val){ 
     transformer(val) *= multiplicand; 
    } 
} 

self_referenceは、その入力パラメータへの参照を返すファンクタつまり、やろうとしているものない標準ライブラリの何かがありますか?

(標準ライブラリはstd::lessstd::plusのようなものがありますが、私はもっと基本的なものを求めていないのですか?)

だから、次のコードは動作するはずです:

int x[4] = {1, 3, 5, 7}; 
multiply_range(x, x + 4, 2); 
// x will become {2, 6, 10, 14} 

vector<int> y[2] = {{1, 2}, {3, 4, 5}}; 
multiply_range(y, y + 2, 2, [](vector<int>& v) -> int& { return v[0]; }); 
// y will become {{2, 2}, {6, 4, 5}} 

C++ 11 C++ 14も問題ありません。

答えて

4

その入力パラメータ

への参照を返すファンクタは、あなたが探しているもの

自身を返します

C++のFunctorとは全く異なります"アイデンティティ"変換(er、またはfunctor)として最もよく知られており、C++標準ライブラリの一部ではありません。

+0

あなたはそうです。私は質問のタイトルを変更します。 – Bernard

+0

私は、 ''テンプレートライブラリのどの部分もそのようなファンクタの使用を必要としないことに驚いています。 – Bernard

関連する問題