Ответ 1
Я действительно хочу, чтобы вы использовали 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&
!"
Но по крайней мере мы используем стандартные компоненты библиотеки (yay)?
А по количеству строк это не хуже других вариантов: http://ideone.com/6dfzxz