Capisco il problema di base nel passare l'indirizzo di una funzione membro al di fuori della sua classe. Ho la sensazione che mem_fn() potrebbe essere la soluzione, ma ho problemi con le specifiche.Come dichiarare un mem_fn C++ (membro_funzione) nella dichiarazione di funzione?
Ho una funzione membro della classe p che è attualmente dichiarato come
typedef void (*valNamedFlagsCallback)(const int, const bool);
bool valNamedFlags(const OptBlk *operand, const char *description_of_value_or_NULL, const int subscripts[], const char *names[], valNamedFlagsCallback callBack);
In classe e sto provando a chiamare valNamedFlags con
pInstance->valNamedFlags(operand, "Statement types", statementsSubscripts, statementsNames, std::mem_fn(&e::setStatement));
(ho iniziato senza la mem_fn() ma, naturalmente, questo ha il classico problema di "puntatori alle funzioni degli utenti". Ho provato sia & e :: setStatement che semplicemente & setStatement.)
.210FWIW, setStatement è prototipo come
void setStatement(const int ifcid, const bool isAffirmative);
Tutto funziona se elimino il mem_fn() e dichiaro setStatement come statica. Lo sto solo indicando come un modo per dire che ho eliminato tutti gli altri possibili problemi; il mio unico problema è il problema dei "puntatori alle funzioni dei membri". Sfortunatamente, setStatement() deve essere una funzione membro, non una statica.
L'errore specifico che sto ottenendo in MS VS 2010 è
bool p :: valNamedFlags (const OptBlk *, const char *, const int [], const char * [], p :: valNamedFlagsCallback)': non può convertire il parametro 5 da 'std :: tr1 :: _ Mem_fn3 < _Rx, _Pmf, _Arg0, _Arg1, _Arg2>' a 'p :: valNamedFlagsCallback'
Vorrei ottenere la dichiarazione di callback indipendenti di classe e; cioè, non voglio andare a
typedef void (*e::valNamedFlagsCallback)(const int, const bool);
perché voglio mantenere p più generalizzato di quello.
È mem_fn() la soluzione giusta o la mia base di partenza? In tal caso, come dovrei dichiarare la richiamata nel prototipo valNamedFlags()?
Oppure devo seguire un approccio diverso?
Dai un'occhiata a ['std :: bind'] (http://en.cppreference.com/w/cpp/utility/functional/bind) – StoryTeller
^... e' std :: function' quando ci siamo già. –
Grazie. Ho dato un'occhiata a molte pagine Web e la mia testa sta nuotando. Ho bisogno di alcuni dettagli. Ecco perché sono venuto qui con questa domanda. – Charles