Ho molta voglia di utilizzare std::get
come funtore, perché è già fornita come una funzione di libreria !!
Non sarebbe bello se potessimo scrivere questa riga !?
std::transform(pairs.begin(), pairs.end(), std::back_inserter(items), std::get<0>);
... Ma è un po 'più terribile di quello. È necessario disambiguare che get
da usare:
int main() {
std::vector<int> items;
std::vector<std::pair<int, int>> pairs;
pairs.push_back(std::make_pair(1, 3));
pairs.push_back(std::make_pair(5, 7));
std::transform(pairs.begin(), pairs.end(), std::back_inserter(items),
(const int& (*)(const std::pair<int, int>&))std::get<0>);
return 0;
}
Il problema è, std::get
is overloaded a prendere 1. pair&
, 2. const pair&
e 3. pair&&
come parametri, in modo che funziona per qualsiasi tipo di coppia come input.Purtroppo, i sovraccarichi ottengono nel senso del tipo di modello detrazione per std::transform
, così la nostra linea originale
std::transform(pairs.begin(), pairs.end(), std::back_inserter(items), std::get<0>);
rendimenti
error: no matching function for call to ‘transform(std::vector<std::pair<int, int> >::iterator, std::vector<std::pair<int, int> >::iterator, std::back_insert_iterator<std::vector<int> >, <unresolved overloaded function type>)’
std::transform(pairs.begin(), pairs.end(), std::back_inserter(items), std::get<0>);
^
...
/usr/include/c++/4.8/bits/stl_algo.h:4915:5: note: template argument deduction/substitution failed:
note: couldn't deduce template parameter ‘_UnaryOperation’
std::transform(pairs.begin(), pairs.end(), std::back_inserter(items), std::get<0>);
Non sa che il sovraccarico di std::get
si sta chiedendo quando implementò il modello per std::transform
, quindi è necessario specificarlo manualmente. Lanciare il puntatore alla funzione corretta dice al compilatore "Ehi, per favore usa il sovraccarico dove get
prende un const&
e restituisce un const&
!"
Ma almeno stiamo utilizzando componenti di libreria standard (yay)?
E in termini di numero di linee, non è peggio rispetto alle altre opzioni: http://ideone.com/6dfzxz
Qualcuno può pensare a qualche miglioramento? Sarebbe fantastico poter usare in modo pulito 'std :: get' in questo modo. ... Probabilmente dovrei usare 'reinterperet_cast &)> (std :: get <0>)', ma sembra ancora peggio ... –
NHDaly
Penso che è possibile sostituire il cast "hard" con la funzione get racchiusa all'interno di una lambda per la quale è possibile specificare gli argomenti –