aşağıdaki şablona sahip değil.Derleyici, şablon parametrelerini (map std :: vector -> std :: vector)
template<typename T, typename U>
std::vector<U> map(const std::vector<T> &v, std::function<U(const T&)> f) {
std::vector<U> res;
res.reserve(v.size());
std::transform(std::begin(v), std::end(v), std::end(res), f);
return res;
}
Kodumda kullandığımda, şablon parametrelerini belirtmem gerekir. Derleyici neden benim için bunu anlayamıyor? Bu çalışmayı yapmak için şablon tanımımı nasıl değiştirmeliyim?
vector<int> numbers = { 1, 3, 5 };
// vector<string> strings = map(numbers, [] (int x) { return string(x,'X'); });
vector<string> strings = map<int, string>(numbers, [] (int x) { return string(x,'X'); });
Runnable kodu: http://ideone.com/FjGnxd
bu soruya orijinal kod buradan geliyor: The std::transform-like function that returns transformed container
kullanılarak
Son olarak
decltype
vedeclval
yerineresult_of
kullanılarakaynı fikri bir başka versiyonu, 'typename std :: sonuç_0 :: type', 'map' işlevinin içinde birden çok yerde görünür. Bunu daha kısa yapmak için yazamazsınız, ancak bunun için bir takma ad oluşturmanın bir yolu vardır, böylece tekrarlama olmaz mı? –
Ferenc
@Ferenc C++ 14'e sahipseniz, std :: result_of_t 'şeklinde kısaltılabilir. Veya kendi şablonunuzu yazarak result_of_t = typename result_of :: type; –
Praetorian