Desidero eseguire il std::bind
per una funzione membro da una classe di base privata, resa "pubblica" con una dichiarazione using
nella classe derivata. Chiamando la funzione lavora direttamente, ma sembra vincolante o usando puntatori a funzione membro non può essere compilato:Associazione alla funzione membro ereditato privatamente
#include <functional>
struct Base {
void foo() { }
};
struct Derived : private Base {
using Base::foo;
};
int main(int, char **)
{
Derived d;
// call member function directly:
// compiles fine
d.foo();
// call function object bound to member function:
// no matching function for call to object of type '__bind<void (Base::*)(), Derived &>'
std::bind(&Derived::foo, d)();
// call via pointer to member function:
// cannot cast 'Derived' to its private base class 'Base'
(d.*(&Derived::foo))();
return 0;
}
Guardando i messaggi di errore di cui sopra, il problema sembra essere che Derived::foo
è ancora solo Base::foo
, e posso' t accedere a Base
tramite Derived
all'esterno dello Derived
stesso.
Questo sembra incoerente - non dovrei essere in grado di utilizzare le chiamate dirette, le funzioni associate e i puntatori di funzione in modo intercambiabile?
C'è una soluzione che mi permetteva di legarsi a foo
su un oggetto Derived
, preferibilmente senza cambiare Base
o Derived
(che sono in una biblioteca che non possiedo)?
Come soluzione (un po 'brutta) è possibile utilizzare un lambda '[& d]() {d.foo(); } '. – Holt