我真的希望你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
带 aconst&
并返回 a的重载const&
!”
但至少我们使用的是标准库组件(耶)?
就行数而言,它并不比其他选项差:http:
//ideone.com/6dfzxz