ho una mappa che memorizza un semplice struct con una chiave. La struct ha due funzioni membro, una è const l'altra no. Sono riuscito chiamando la funzione const utilizzando std :: for_each senza problemi, ma ho qualche problema chiamando la funzione non-const.Boost.Bind per accedere std :: elementi della mappa in std :: for_each
struct MyStruct {
void someConstFunction() const;
void someFunction();
};
typedef std::map<int, MyStruct> MyMap;
MyMap theMap;
//call the const member function
std::for_each(theMap.begin(), theMap.end(),
boost::bind(&MyStruct::someConstFunction, boost::bind(&MyMap::value_type::second, _1)));
//call the non-const member function
std::for_each(theMap.begin(), theMap.end(),
boost::bind(&MyStruct::someFunction, boost::bind(&MyMap::value_type::second, _1)));
La chiamata alla funzione membro const funziona bene, ma sembra aumentare internamente aspetta una MyStruct const da qualche parte, e, quindi, non riesce con il seguente errore di compilazione in MSVC7.1.
spinta \ bind \ mem_fn_template.hpp (151): l'errore C2440: 'argomento': non può convertire da 'MyStruct const * __ W64' a 'MyStruct * const'
Apprezzerei tutto aiuto su come impostare correttamente i parametri del modello, in modo legano riconosce i parametri in modo corretto e fammi chiamare la funzione non const.
grazie, Carl
Che ne dici se si esegue il backup e ci dici cosa stai davvero cercando di realizzare qui?Usare for_each con una mappa con boost :: bind * potrebbe * essere ragionevole, ma è molto probabile che un approccio generale diverso funzioni meglio (molte volte questo tipo di domande sorge, è perché 'std :: for_each' è una scelta sbagliata per la situazione, e qualcosa come 'std :: copy' o std :: accumulate' farebbe il lavoro molto più semplicemente). –
Il MyStruct è usato in una sorta di sistema particellare, in cui MyStruct è la particella. La funzione const è una funzione draw(), la funzione non const calcola la nuova posizione. La chiave nella mappa è la data di creazione. In ogni caso, nel punto in cui ho postato la domanda, era più su come fare quel lavoro che se questo fosse un buon progetto all'inizio. – Carl