2011-10-07 2 views
0

다음은 하나의 좋은 예제에서 약간 수정 된 코드입니다. 한 문자열의 벡터에서 다른 벡터의 벡터로 값을 복사하는 방법입니다. 나는 동적으로 할당 된 객체를 사용하고 있는데이 경우공유 포인터 벡터를 사용하여 람다를 향상 시키십시오

#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; 
} 

, 그리고 부스트 : : 람다 :: 바인드 부스트 :: 바인드 등의 변경을 처리 할 수 ​​없기 때문에, 나는 역 참조 자리에 필요합니까 : (another copy algorithm 참조) 위해 컴파일 :

std::for_each(objects.begin(), objects.end(), bind(&Object::Name, *_1) = *var(names_it)++); 

하지만 출력에서 ​​내가있어이 :

Gamma 
Gamma 
Gamma 

당신의 설명은 무엇입니까?

+0

[Boost.Phoenix v3] (http://www.boost.org/libs/phoenix/)의 최신 버전에서는 Boost.Lambda가 공식적으로 더 이상 사용되지 않습니다. 새로운 코드 대신 Phoenix를 사용하십시오. : -] – ildjarn

답변

3
std::vector<shared_ptr<Object> > objects(3, make_shared<Object>()); 

이 일을하는 것과 같습니다

shared_ptr<Object> object = make_shared<Object>(); 
std::vector<shared_ptr<Object> > objects(3, object); 

벡터 생성자는 그가 (3 개 사본을 모두 같은 하나 독특한Object를 참조 것 object 포인터의을 만들 것입니다 예 : *object). 벡터를 각각 자신의 Object으로 초기화 된 별도의 포인터로 채 웁니다.

+1

Boost.Lambda 'solution'을 완전히 포기했습니다. 나는 스위치를 만들 수 있다면 Boost.Phoenix (v3)을 추천한다. –

관련 문제