[英]boost lambda with a vector of shared pointers
Below is a slightly modified code from one good example how to copy values fro one vector of strings to another vector of objects. 下面是一个很好的示例的经过稍微修改的代码,该示例如何将字符串的一个向量中的值复制到另一个对象向量中。 (see: another copy algorithm )
(请参阅: 另一种复制算法 )
#include <algorithm>
#include <cstdlib>
#include <iostream>
#include <string>
#include <vector>
#include <boost/lambda/bind.hpp>
#include <boost/lambda/lambda.hpp>
#include <boost/shared_ptr.hpp>
#include <boost/make_shared.hpp>
using boost::shared_ptr;
using boost::make_shared;
using namespace boost::lambda;
class Object
{
public:
std::string Name;
Object(const std::string& Name_ = "")
: Name(Name_)
{
}
};
int main()
{
//std::vector<Object> objects(3, Object());
std::vector<shared_ptr<Object> > objects(3, make_shared<Object>());
std::vector<std::string> names;
names.push_back("Alpha");
names.push_back("Beta");
names.push_back("Gamma");
std::vector<std::string>::const_iterator names_it;
names_it = static_cast<const std::vector<std::string>&>(names).begin();
//std::for_each(objects.begin(), objects.end(), bind(&Object::Name, _1) = *var(names_it)++);
std::for_each(objects.begin(), objects.end(), bind(&Object::Name, *_1) = *var(names_it)++);
//std::vector<Object>::iterator it, end = objects.end();
std::vector<shared_ptr<Object> >::iterator it, end = objects.end();
for (it = objects.begin(); it != end; ++it) {
//std::cout << it->Name << std::endl;
std::cout << (*it)->Name << std::endl;
}
return EXIT_SUCCESS;
}
In this case I'm using dynamically allocated Objects, and because boost::lambda::bind can't handle such changes as boost::bind do, I need to dereference placeholder in order to compile: 在这种情况下,我使用的是动态分配的对象,并且由于boost :: lambda :: bind无法处理boost :: bind这样的更改,因此我需要取消引用占位符才能进行编译:
std::for_each(objects.begin(), objects.end(), bind(&Object::Name, *_1) = *var(names_it)++);
But then at the output I've got: 但是然后在输出中我得到:
Gamma
Gamma
Gamma
What is your explanation? 你的解释是什么?
std::vector<shared_ptr<Object> > objects(3, make_shared<Object>());
This is equivalent to doing: 这等效于:
shared_ptr<Object> object = make_shared<Object>();
std::vector<shared_ptr<Object> > objects(3, object);
The vector constructor will then make 3 copies of that object
pointer, which will all refer to same one and unique Object
(that is to say, *object
). 然后,向量构造函数将复制该
object
指针的3个副本 ,这些副本均指向同一Object
和唯一的 Object
(即*object
)。 Fill the vector with separate pointers each initialized with their own Object
. 用单独的指针填充向量,每个指针都用自己的
Object
初始化。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.