Я действительно хочу, чтобы вы использовали std::get
в качестве функтора, потому что он уже предоставлен как функция библиотеки !!
Не было бы замечательно, если бы мы могли написать эту строку!?
std::transform(pairs.begin(), pairs.end(), std::back_inserter(items), std::get<0>);
... Но это немного страшнее, чем это. Вам необходимо выяснить, какие get
использовать:
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;
}
Проблема в том, что std::get
перегружен , чтобы принять 1. pair&
, 2. const pair&
и 3. pair&&
в качестве параметров, чтобы он работал для любого вида пары в качестве входа. К сожалению, перегрузки мешают выводу типа шаблона для std::transform
, поэтому наша оригинальная строка
std::transform(pairs.begin(), pairs.end(), std::back_inserter(items), std::get<0>);
выходы * * тысяча двадцать-одны
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>);
Он не знает, какую перегрузку std::get
вы запрашиваете при выводе шаблона для std::transform
, поэтому вы должны указать его вручную. Приведение указателя функции к нужному типу говорит компилятору: «Эй, пожалуйста, используйте перегрузку, где get
принимает const&
и возвращает const&
!»
Но, по крайней мере, мы используем стандартные библиотечные компоненты (да)?
И по количеству строк он ничем не хуже других вариантов:
http://ideone.com/6dfzxz