2012-04-15 1 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': не удается преобразовать параметр 2 из «сопзЬ повышения :: лямбда :: lambda_functor 'to' 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) Я хочу получить доступ ко второму члену карты map :: pair. Но результатом является функтор. Любые предложения, как справиться с этим? – Mark

+0

Извините, я не знаю. – cdiggins