Considerate questo codice:C++ Stati Puntatore Funzione Definizione
#include <iostream>
#include <functional>
struct B {
template <class C, class M, class T>
void call1(C (M::*member)(), T *instance) {
std::function<void()> fp = std::bind(member, instance);
fp();
}
template <class C, class M, class T>
void call2(C (M::*member), T *instance) {
std::function<void()> fp = std::bind(member, instance);
fp();
}
void foo() {
call1(&B::func, this); // works
call2(&B::func, this); // works
call1(&B::func2, this); // Error: no matching member function for call to 'call2'
call2(&B::func2, this); // works
}
void func() {
std::cout << "func\n";
}
void func2() const volatile {
std::cout << "func2\n";
}
};
int main() {
B{}.foo();
}
Sembra che la versione successiva non accetta funzioni con qualificazioni cv in più.
Qual è la differenza tra la specifica di un puntatore membro della funzione come questo C (M::*member)()
e come questo C (M::*member)
?
Non sapevo nemmeno che 'C (M :: * member)' è una sintassi valida ... –
Il punto è che 'call1' non accetta le funzioni con qualificatori cv, mentre' call2' lo consente. – Crossfire
Non correlato, ma perché preoccuparsi di usare 'std :: bind' invece di chiamare direttamente la funzione membro? '(istanza -> * membro)();' –