vector<T>
aを に変換できる射影関数を作成しようとしていvector<R>
ます。次に例を示します。
auto v = std::vector<int> {1, 2, 3, 4};
auto r1 = select(v, [](int e){return e*e; }); // {1, 4, 9, 16}
auto r2 = select(v, [](int e){return std::to_string(e); }); // {"1", "2", "3", "4"}
最初の試み:
template<typename T, typename R>
std::vector<R> select(std::vector<T> const & c, std::function<R(T)> s)
{
std::vector<R> v;
std::transform(std::begin(c), std::end(c), std::back_inserter(v), s);
return v;
}
しかし、
auto r1 = select(v, [](int e){return e*e; });
私は得る:
エラー C2660: 'select': 関数は 2 つの引数を取りません
私は明示的に仕事に電話select<int,int>
しなければなりません。型が冗長なので、私はこれが好きではありません。
auto r1 = select<int, int>(v, [](int e){return e*e; }); // OK
2 回目の試行:
template<typename T, typename R, typename Selector>
std::vector<R> select(std::vector<T> const & c, Selector s)
{
std::vector<R> v;
std::transform(std::begin(c), std::end(c), std::back_inserter(v), s);
return v;
}
結果は同じエラーで、関数は 2 つの引数を取りません。この場合、実際には 3 番目の型引数を指定する必要があります。
auto r1 = select<int, int, std::function<int(int)>>(v, [](int e){return e*e; });
3 回目の試行:
template<typename T, typename R, template<typename, typename> class Selector>
std::vector<R> select(std::vector<T> const & c, Selector<T,R> s)
{
std::vector<R> v;
std::transform(std::begin(c), std::end(c), std::back_inserter(v), s);
return v;
}
為に
auto r1 = select<int, int, std::function<int(int)>>(v, [](int e){return e*e; });
エラーは次のとおりです。
'select' : 'Selector' のテンプレート引数が無効です。クラス テンプレートが必要です
為に
auto r1 = select(v, [](int e){return e*e; });
エラー C2660: 'select': 関数は 2 つの引数を取りません
(最後の 2 つの試行が特に優れているわけではないことはわかっています。)
select()
このテンプレート関数を最初に書いたサンプル コードで機能するようにするにはどうすればよいですか?