2012-04-15 11 views
0

boost :: lambdaを使用してコードを単純化したいと思います。ここに私のコードは次のとおりです。boost :: lambda std :: map

// Declare container: 
typedef std::map< PageId, Page* > Pages; 
Pages m_pages; 

// For serialization: 
template < class DataType > TPair<DataType> makePair(const std::string& identification, const DataType& dataType) 
{ 
    return TPair<DataType>(identification, dataType); 
} 

#define SERILIZE_CLASS(_value) ::Tools::Serilizer::makePair<::Tools::Serilizer::Serilizable>(EXTRACT_NAME(_value), _value) 



// This does work and should be simplified by.... 
for(BOOST_AUTO(i, m_pages.begin()); i != m_pages.end(); ++i) 
{ 
    obj << SERILIZE_CLASS(*i->second); 
} 

// this code but itdoes not compile 
std::for_each(m_pages.begin(), m_pages.end(), 
obj << SERILIZE_CLASS(boost::lambda::bind(&Pages::value_type::second, boost::lambda::_1))); 

最後に、これは結果としてエラーコードです:

エラーC2664: 'ツール:: Serilizer :: makePair':CONSTブースト」からパラメータ2を変換することはできません::ラムダ:: lambda_functor 'から' const Tools :: Serilizer :: Serilizable & '

これを解決するヒントはありますか?

+0

Boost.Lambdaは正式に廃止されました。新しいコードの代わりに[Boost.Phoenix](http://www.boost.org/libs/phoenix/)を使用してください。 – ildjarn

答えて

0

私はあなたの問題はラムダによって返された値とラムダ(つまり、関数である)を混合さだと思う。たとえば

を:

boost::lambda::bind(&Pages::value_type::second, boost::lambda::_1) 
関数を返します

その結果をserialize_class(...)と呼んでも意味がありません。

しかし、私はあなたのコードを深く研究していません。私はちょっと混乱していると感じました。

+0

あなたは正しいと思います。 boost :: lambda :: bind(&Pages :: value_type :: second、boost :: lambda :: _ 1)私はマップマップ::ペアの第2項にしかアクセスしません。しかし結果はファンクタです。どのようにこれを処理するための任意の提案? – Mark

+0

ごめんなさい。 – cdiggins

関連する問題