Per farla breve, esiste un modo semplice/definito per trattare gli oggetti funzione/lambdas e le funzioni membro in modo semplificato?Utilizzo di std :: function/mem_fn in C++ 11 con funzioni membro
Se ho capito bene, se uso std :: mem_fn, ho bisogno di passare un oggetto del tipo corretto per la chiamata di funzione, vale a dire
Object o;
ftncall std::mem_fun(&Object::function);
ftncall(o);
Idealmente, ci sarebbe un modo per 'attaccare 'o
per quell'oggetto funzione, forse come std::weak_ptr
, quindi sappiamo se è stato cancellato. Ad esempio, se ci fosse un modo per fare qualcosa di vagamente simile a questo:
Object o;
ftncall std::mem_fn(&Object::function, o); // Or maybe std::mem_fn<Object>
ftncall();
Ora, ovviamente, questo non esiste (a mia conoscenza). C'è un modo per avvolgere std :: mem_fn in modo tale da non perdere la generalità (e la gentilezza) di std :: mem_fn, ma posso 'allegare' o
, E giocare ancora bene con l'altro tipo di funzione, come std :: funzione? Idealmente, sarei ancora in grado di usare operator()
nel modo in cui faccio con std :: function.
Attualmente la soluzione migliore che posso pensare è una classe che assomiglia a questo:
template<class T>
class MemFunWrapper {
public:
MemFunWrapper(T* t, std::mem_fun funct) : m_t(t), m_function(funct) {}
std::mem_fun operator*() { return m_function; }
T* get() { return m_t; }
private:
T* m_t;
std::mem_fun m_function;
}
allora si potrebbe utilizzare questa convenzione:
(*MemFunWrapper)(MemFunWrapper->get(), args...);
Ma che sembra abbastanza ingombrante per me. Inoltre, dovrei creare una classe equivalente per la funzione std :: per far sì che sia utilizzabile in modo analogo, e ciò sembra sciocco dal momento che posso già usare semplicemente std :: function. Idealmente, sarei anche in grado di utilizzare il prodotto finale senza sapere se sto chiamando una funzione membro o una funzione regolare. So che sto chiedendo molto - qualsiasi direzione sarebbe utile. Grazie molto!
Perché grazie - potresti aver appena realizzato tutte le mie speranze e i miei sogni! –
Non dovrebbe la riga 'auto fn = std :: bind (& Object :: member, o);' be 'auto fn = std :: bind (& Object :: member, &o);', attenzione al secondo argomento di 'std: : bind' –
Dipende dalle tue intenzioni Entrambi sono utili in diverse circostanze – goji