すべての意図と目的のために std::vector のように機能するカスタム ベクトル クラスがあります。シンプルなマップ機能を追加したい:
template <class T> class Vector
{
public:
template<class mapFunction> Vector<typename mapFunction::result_type> map(mapFunction function)
{
Vector<mapFunction::result_type> result(_Length);
for(UINT i = 0; i < _Length; i++)
{
result[i] = function(_Data[i]);
}
return result;
}
...
}
使用法:
Vector<int> v(5);
for(int i = 0; i < 5; i++) v[i] = i;
auto mappedVector = v.map(function<double(int)>([](int a) { return a * 2.0; }));
これは機能しますが、ラムダ式から へのキャストの必要性を回避しようとしていstd::function
ます。理想的にはv.map([](int a) { return a * 2.0; }));
、「make_pair」に似た「make_function」を記述して、テンプレート パラメーターの必要性を回避できることを認識しているだけですが、それでもすべてのラムダをキャストする必要があります。
std::function
生のラムダ型から戻り値の型を抽出する方法がわからないため、 a にキャストします。したがって、私は使用してstd::function::result_type
います。
私は以下がうまくいくと思っていましたが、そうではありません.コンパイラは、「returnType」のテンプレート引数を推測できないと不平を言うだけです:
template<class mapFunction, class returnType> Vector<returnType> Map2(mapFunction function)
{
Vector<returnType> result(_Length);
for(UINT i = 0; i < _Length; i++)
{
result[i] = function(_Data[i]);
}
return result;
}
私はそれがこれを行うことを認識してstd::transform
います (マップの本体を への呼び出しに簡単に置き換えることができますstd::transform
) が、私の問題は実際にはテンプレート パラメーターを指定する正しい方法にあります。