我建议您使用
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&&
作为参数,以便适用于任何类型的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::transform
的模板时,它不知道你要请求哪个
std::get
的重载,所以你必须手动指定。将函数指针强制转换为正确的类型告诉编译器:“嘿,请使用其中一个重载,在此重载中
get
接受
const&
并返回
const&
!”
但至少我们正在使用标准库组件(耶)?
而且就行代码行数而言,它不比其他选项更差:
http://ideone.com/6dfzxz