Ho il seguente modello.Il compilatore non deduce i parametri del modello (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;
}
Quando lo uso nel mio codice, ho specificato i parametri del modello. Perché il compilatore non è in grado di dedurlo per me? Come devo cambiare la definizione del mio modello per farlo funzionare?
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'); });
codice Runnable: http://ideone.com/FjGnxd
Il codice originale di questa domanda viene da qui: The std::transform-like function that returns transformed container
Solitamente, 'nometipo std :: result_of :: type' si presenta in più punti all'interno della funzione 'map'. Non è possibile digitarlo per renderlo più breve, ma è un modo per creare un alias in modo che non ci sia ripetizione? –
Ferenc
@Ferenc Se si dispone di C++ 14, può essere abbreviato in 'std :: result_of_t'. Oppure puoi scrivere il tuo 'modello usando result_of_t = typename result_of :: type;' –
Praetorian