tr1 サービス パックと Intel C++ Compiler 11.1.071 [IA-32] で Visual Studio 2008 を使用すると、これは私の他の質問に関連しています。
Rubyバージョンのように機能するc ++の機能マップを作成しようとしています
strings = [2,4].map { |e| e.to_s }
だから私は VlcFunctional 名前空間で次の関数を定義しました
template<typename Container, typename U>
vector<U> map(const Container& container, std::tr1::function<U(Container::value_type)> f)
{
vector<U> transformedValues(container.size());
int index = -1;
BOOST_FOREACH(const auto& element, container)
{
transformedValues.at(++index) = f(element);
}
return transformedValues;
}
これを次のように呼び出すことができます (関数テンプレートの引数は明示的に定義されていることに注意してください)。
vector<int> test;
test.push_back(2); test.push_back(4);
vector<string> mappedData2 = VlcFunctional::map<vector<int>,string>(test, [](int i) -> string
{
return ToString(i);
});
またはそのように (関数テンプレートの引数は明示的に定義されていないことに注意してください)
std::tr1::function f = [](int i) -> string { return ToString(i); };
vector<string> mappedData2 = VlcFunctional::map<vector<int>,string>(test, f);
しかし決定的に、これは好きではありません
vector<string> mappedData2 = VlcFunctional::map(test, [](int i) -> string { return ToString(i); });
テンプレート引数を明示的に定義しないと、どのテンプレートを使用するかがわからず、コンパイル エラーが発生します。
..\tests\VlcFunctional_test.cpp(106): error: no instance of function template "VlcFunctional::map" matches the argument list, argument types are: (std::vector<int, std::allocator<int>>, __lambda3)
テンプレート引数を定義する必要があるため、構文がはるかにかさばります。呼び出しサイトでのクラフトを最小限に抑えることを目指しています-変換方法がわからない理由についてのアイデアはありますか? これはコンパイラの問題ですか、それとも言語がこのタイプのテンプレート引数の推論を許可していませんか?