現在、テンプレート化された関数でいくつかの演習を行っています。 私は変換アルゴリズムの実装を書いています。 私は次のようにそれをやったし、それが動作します: テンプレートを使用したラムダ
template <class in, class out, class T>
out stransform(in b, in e, out d, T p(const T&)) {
while (b != e)
*d++ = p(*b++);
return d;
}
通常と同じように、私は今
stransform(begin(vec1), end(vec1), back_inserter(vec2), predi<double>);
のように明示的なタイプと述語を呼び出す必要があります変換、私はCにつまずい++ 11ラムダとこのように私の関数を呼び出すしたい:私は種類を推定するカントというコンパイルエラーを取得しないものと
stransform(begin(vec1), end(vec1), back_inserter(vec2), [] (double x) ->double {return x * 10;});
。 これは私のラムダのT型を実際に2回定義しているので理解できません。
私は、それが働いている元の変換関数もチェックしました。私はその後、そのうちのimplementationをチェックし、それは明らかに関数全体のテンプレートクラスで実装されています。 これは、テンプレートで述部を実装する正しい方法ですか?これが機能するには、ポインタ、ラムダや関数オブジェクトを受け入れます
template <class in, class out, class UnaryPredicate>
out stransform(in b, in e, out d, UnaryPredicate p);
:
私はトランスフォームの実装を読んだ後、それほど簡単だと思っていました。私はまだ私が他の場合にはうまくいかない理由はまだ不思議です。 – inf
@bamboonラムダは関数ではなく関数オブジェクトであるため、状態を保持することができるので(これはクロージャであり、単なる関数ではありません)、私は推測します。 –
キャプチャを実行しないラムダは、通常の関数(ポインタ)に変換可能であることに注意してください。 – spraff