在 std::for_each 中使用 std::get<>()
using std::get<>() in std::for_each
我有一个在std::for_each
循环中迭代的映射。我使用嵌套绑定和简单的辅助函数来获取所需的对中的元素。
typedef std::map<int, Foo> MapType;
std::for_each(
testMap.begin() ,
testMap.end() ,
std::bind(
&Foo::myIncredibleFunction ,
std::bind(
&ValueExtractor< MapType::key_type , MapType::mapped_type >::getValue,
std::placeholders::_1 )));
这工作得很好(虽然我确信可以改进)
我还打算将当前代码库从当前级别迁移到c++ 11,因此我正在考虑是否可以使用该语言的新功能来改进代码(可读性,效率)。例如,我尝试了以下操作(失败-参见下面的模板错误)
std::for_each(
testMap.begin() ,
testMap.end() ,
std::bind(
&Foo::myIncredibleFunction ,
std::get<1>( std::placeholders::_1 )));
误差 1>d:projectstest_bindtest_bindtest_bind.cpp(48): error C2780:
std::bind ...<Snip>...
: expects 6 arguments - 2 provided
也有以下智能感知:
IntelliSense: no instance of overloaded function "std::get" matches the argument list
argument types are: (std::_Ph<1>)
我尝试了std:get<1>()
的各种用法组合,试图取代我的内部绑定,但没有成功。我怀疑我没有正确理解这一点,但感觉我应该能够做我想做的。是否有一种方法来做到这一点使用std::get
调用和没有辅助函数/函子?
编辑:我认为KennyTM已经提出了我的答案,关于我在代码中实际做的事情,它比我的方法好得多。我仍然对上述std::get<>
是否可以使用或为什么不使用感兴趣。
既然你已经在使用c++ 11了,为什么不使用一个基于范围的for循环(这在VS 2012中是支持的)?
for (auto&& item : testMap) {
item.second.myIncredibleFunction();
}
您的问题是std::get<1>(_1)
本身是一个非常好的函数调用。
你在这里要做的叫做函数组合,这可以通过嵌套绑定调用来完成,例如std::bind(foo, std::bind(bar, _1))
。这里的问题是第二部分,其中bar = std::get<1>
- std::bind(&std::get<1>, _1)
显然是第一次尝试,但这不起作用,因为std::get
需要更多的模板参数。
一个解决方案是自定义函数对象:
#include <utility>
template<unsigned I>
struct get{
template<class T>
auto operator()(T&& v) -> decltype(std::get<I>(std::forward<T>(v)))
{ return std::get<I>(std::forward<T>(v)); }
};
然后:std::bind(&Foo::myIncredibleFunction, std::bind(get<1>(), _1))
.
相关文章:
- 使用std::multimap迭代器创建std::list
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- 错误:调用"std::vector<:vector<int>>::p ush_back(std::vector<std::__cxx11::basic_string<
- C 建造者Clang STD :: Sill,找不到超载的操作员&lt;
- 为什么STD :: MAP需要操作员&lt;以及我如何写一个
- std::vector::reserve(未知m),我知道m<<;N(通常)并且知道N
- std::vector<;uint8_t>;当C++11/14启用时,手动复制而不是调用memcpy
- C++运算符<<调用::ostream而不是std::osttream
- 是std :: set&lt; std :: future&gt;不可能存在
- 在修改列表后,std :: list&lt; t&gt; :: end()的值是否会更改
- BOOST ::变体无法解决运算符&lt;&lt;对于STD :: Ostream
- C++重载<<具有typedef'd std::vector
- 以x的倍数填充前导零,使用std::cout<<std::十六进制
- 错误:没有匹配'运算符<<"在'std::cout
- std::pair的默认构造函数<>将基本类型(int等)设置为零
- std::ostream&operator< & lt; (std:: ostream&压力,压力& &;val)
- 将std::endl传递给std::operator<<
- std::映射<>或std::vector<>在处理大型标志集时
- 重载& lt; & lt;使用命名空间std