Menggunakan visual studio 2008 dengan paket layanan tr1 dan Intel C++ Compiler 11.1.071 [IA-32], ini terkait dengan pertanyaan
Saya mencoba menulis peta fungsional untuk c++ yang akan berfungsi seperti versi Ruby
strings = [2,4].map { |e| e.to_s }
Jadi saya telah mendefinisikan fungsi berikut di namespace 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;
}
dan Anda dapat menyebutnya seperti ini (Perhatikan bahwa argumen templat fungsi didefinisikan secara eksplisit):
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);
});
Atau seperti itu (Perhatikan bahwa argumen templat fungsi tidak didefinisikan secara eksplisit)
std::tr1::function f = [](int i) -> string { return ToString(i); };
vector<string> mappedData2 = VlcFunctional::map<vector<int>,string>(test, f);
Tapi yang penting, BUKAN SEPERTI INI
vector<string> mappedData2 = VlcFunctional::map(test, [](int i) -> string { return ToString(i); });
Tanpa definisi eksplisit dari argumen template hte, ia tidak mengetahui template mana yang akan digunakan dan menyebabkan kesalahan kompilasi
..\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)
Keharusan mendefinisikan argumen templat membuatnya menjadi sintaksis yang jauh lebih besar dan saya bertujuan untuk meminimalkan kesalahan di situs panggilan - ada ide mengapa ia tidak tahu bagaimana melakukan konversi? Apakah ini masalah kompiler atau apakah bahasanya tidak mengizinkan inferensi argumen templat jenis ini?
typename Container::value_type
dalam deklarasistd::tr1::function
. Visual memaafkan, tetapi kompiler lain tidak. - person Matthieu M.   schedule 09.09.2010