yo probamos este, y algunas variaciones sobre el mismo:Cómo sobrecargar el operador -> *?
template<class T>
class Ptr {
public:
Ptr(T* ptr) : p(ptr) {}
~Ptr() { if(p) delete p; }
template<class Method>
Method operator ->* (Method method)
{
return p->*method;
}
private:
T *p;
};
class Foo {
public:
void foo(int) {}
int bar() { return 3; }
};
int main() {
Ptr<Foo> p(new Foo());
void (Foo::*method)(int) = &Foo::foo;
int (Foo::*method2)() = &Foo::bar;
(p->*method)(5);
(p->*method2)();
return 0;
}
Pero doesn't work. El problema es que realmente no sé qué esperar como parámetro o qué devolver. El estándar en esto es incomprensible para mí, y como Google no mencionó nada útil, creo que no estoy solo.
Editar: Otro intento, con C++ 0x: http://ideone.com/lMlyB
Suena aterrador. Tendré que echar un vistazo. – Fozi
@Fozi: Créanme, lo es. Aunque el documento que simplemente no encuentro tiene una implementación completa, y su puntero inteligente solo necesita heredar desde cierta base y todas las funcionalidades 'operator -> *' estarán ahí. : | – Xeo
De hecho, tengo una clase de delegados que podría hacer eso, pero es bastante pesado, por lo que me gustaría evitar devolverlo como temporal. '(* p). * method' es mucho más simple, aunque esperaba poder admitir' -> * 'fácilmente. – Fozi