在尝试编译以下代码时,会将map
s键复制到vector
:
map<string, string> mss;
vector<string> vs;
transform(mss.begin(), mss.end(), back_inserter(vs), get<0>);
VS2013不能区分get
预期的用途,但是这种更简单的用法可以正常工作:
vs.push_back(get<0>(*mss.begin()));
指定get<0, string, string>
没有帮助。我想念什么?
的重载有很多std::get
,此外,每个重载本身都是函数模板,因此编译器无法告诉您在呼叫站点上想要哪个地址来请求其中之一的地址。如果您坚持使用std::get
,则需要使用static_cast
:
transform(mss.begin(), mss.end(), back_inserter(vs),
static_cast<const map<string, string>::key_type&
(*)(map<string, string>::value_type&)>(std::get<0>)
);
只要instatic_cast
中的类型匹配作为参数给出的可能函数模板的特殊化的声明,该函数就可以工作。另外,您不应尝试显式指定功能模板(如get<0, string, string>
etc)的模板参数-这就是模板参数推导机制的目的。语法不仅丑陋,而且将来还会增加其他重载,从而破坏您的编译。
更好的选择是使用lambda表达式:
transform(mss.begin(), mss.end(), back_inserter(vs),
[](map<string, string>::value_type& p){ return p.first; });
或通用Lambda表达式(C ++ 14):
transform(mss.begin(), mss.end(), back_inserter(vs),
[](auto& p){ return p.first; }); // or `return std::get<0>(p);`
或std::mem_fn
将其参数绑定到指向数据成员或成员函数的给定指针:
#include <functional>
transform(mss.begin(), mss.end(), back_inserter(vs),
mem_fn(&map<string, string>::value_type::first));
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句