2011-10-07 9 views
0

以下は、文字列の1つのベクトルから別のオブジェクトのベクトルに値をコピーする方法の1つの例のわずかに変更されたコードです。私は動的に割り当てられたオブジェクトを使用しています。この場合共有ポインターのベクトルでラムダをブーストする

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

ベクトルコンストラクタその後、つまり(Objectすべて同じ1を参照する3つのコピーそのobjectポインタのを作り、ユニークます例えば、*object)。ベクトルをそれぞれ独自のObjectで初期化された別々のポインタで埋めます。

+1

完全にBoost.Lambda 'solution'をあきらめた。私はBoost.Phoenix(v3)をお勧めします。 –

関連する問題