嵌套绑定到成员,需要一个指针,得到了一个引用.做什么
Nested bind to member, need a pointer, got a reference. What do?
我有一个类型为foo的std::unique_ptr映射,我正在尝试迭代该映射,将每个映射的值传递给不在映射中的foo的公共成员。我很接近,但我不知道如何将最内部绑定的结果从引用转换为指针。
给定:
class foo
{
public:
bool DoWork(foo *);
};
std::map<long, std::unique_ptr<foo> map_t;
map_t foo_map_;
foo bar_;
std::for_each(std::begin(foo_map_), std::end(foo_map_), std::bind(&Foo::DoWork, &bar_, std::bind(&std::unique_ptr<foo>::get, /* This guy here -->*/std::bind(&std::pair<long, std::unique_ptr<foo>>::second, std::placeholders::_1))));
建议?我使用的是Visual Studio 2010 SP1。
编译器错误是由于std::map
构造了密钥类型,因此map_t
的value_type
不是std::pair<long, std::unique_ptr<foo> >
,而是std::pair<long const, std::unique_ptr<foo> >
。为了避免这种错误,优选使用CCD_ 6。以下更改修复了错误:
... std::bind(&map_t::value_type::second, std::placeholders::_1) ...
在C++11中,您可以将其简化为:
for(auto const& kv : foo_map_)
bar_.DoWork(&*kv.second);
或者,使用std::for_each
和C++11 lambda:
for_each(foo_map_.begin(), foo_map_.end(),
[&bar_](map_t::value_type const& kv) { bar_.DoWork(&*kv.second); });
简单太棒了
您可以通过使用一个非常小的lambda来简化代码,而不是std::bind-疯狂,请参阅以下片段:
foo obj;
typedef std::map<long, std::unique_ptr<foo>> fooMap;
fooMap map_t;
std::for_each (
map_t.begin (), map_t.end (),
[&obj](fooMap::value_type& elem) {
obj.DoWork (elem.second.get ());
}
);
相关文章:
- 返回一个引用C++中另一个类对象的对象的有效方法
- 返回一个C++引用变量 VS 返回一个变量
- 有没有办法重写一个返回指向 istringstream 的指针的函数,而不是返回一个引用?
- 如何使用只有一个引用参数的可变长度参数列表
- 为什么重载 ostream 的运算符<<需要一个引用"&"?
- C++ const-cast 一个引用
- 嵌套绑定到成员,需要一个指针,得到了一个引用.做什么
- r-Rcpp可以公开一个引用同一类的C++类方法
- 有没有办法获取对 MFC 对话框中所有子窗口或控件的引用,因为我有一个引用该控件的 CWnd 对象
- C++一个引用的多个转发:首先复制,然后移动
- 在C++中,我是否可以声明一个引用,以表明没有任何内容会修改它
- 将一个对象传递给一个引用函数,即面试测试
- 需要解释才能理解一个引用的例子
- 一个好的C++编译器会优化一个引用吗
- 我有一个引用,想调用一个需要 boost::shared_ptr 的函数
- 在C++中有一个引用成员有什么问题?
- *return如何隐式返回一个引用
- 为什么我得到一个未对齐指针的警告,而不是一个引用
- 是否可以在不同位置为一个引用分配不同的值
- 编写一个引用类型的函数,用作l值来处理它的r值