2012-04-15 18 views
0

Ich möchte meinen Code mit boost :: lambda vereinfachen. Hier ist mein Code: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))); 

Schließlich ist dies die resultierende Fehlercode:

Fehler C2664: 'Werkzeuge :: Serilizer :: makePair': Konvertierung Parameter 2 von ‚const boost :: lambda :: lambda_functor 'zu' const Werkzeuge :: Serilizer :: Serilisierbar & '

Irgendwelche Hinweise, um das zu lösen?

+0

Boost.Lambda ist offiziell veraltet; Bitte verwenden Sie stattdessen [Boost.Phoenix] (http://www.boost.org/libs/phoenix/) in neuem Code. – ildjarn

Antwort

0

Ich denke, Ihr Problem lambda mischt (dh Funktionen) mit den Werten von der Lambda-Ausdrücke zurückgegeben:

Zum Beispiel:

boost::lambda::bind(&Pages::value_type::second, boost::lambda::_1) 

eine Funktion zurück.

Also, serialize_class(...) mit seinem Ergebnis aufrufen macht keinen Sinn für mich.

Das sagte, ich habe Ihren Code nicht in viel Tiefe studiert. Ich fand es ein bisschen verwirrend.

+0

Ich denke, du hast Recht. Mit boost :: lambda :: bind (& Pages :: value_type :: second, boost :: lambda :: _ 1) möchte ich nur auf den zweiten Term der map map :: pair zugreifen. Aber das Ergebnis ist ein Funktor. Irgendwelche Vorschläge, wie man damit umgeht? – Mark

+0

Entschuldigung, ich weiß es nicht. – cdiggins