O que é ->* Operador em C ++?
-
21-09-2019 - |
Pergunta
O C ++ continua a me surpreender. Hoje eu descobri o operador ->*. É sobrecarregável, mas não tenho idéia de como invocar. Consigo sobrecarregá -lo na minha classe, mas não tenho idéia de como chamá -lo.
struct B { int a; };
struct A
{
typedef int (A::*a_func)(void);
B *p;
int a,b,c;
A() { a=0; }
A(int bb) { b=b; c=b; }
int operator + (int a) { return 2; }
int operator ->* (a_func a) { return 99; }
int operator ->* (int a) { return 94; }
int operator * (int a) { return 2; }
B* operator -> () { return p; }
int ff() { return 4; }
};
void main()
{
A a;
A*p = &a;
a + 2;
}
editar:
Graças à resposta. Para chamar a função sobrecarregada, escrevo
void main()
{
A a;
A*p = &a;
a + 2;
a->a;
A::a_func f = &A::ff;
(&a->*f)();
(a->*f); //this
}
Solução
O sobrecarregado ->*
O operador é um operador binário (enquanto .*
não é sobrecarregável). É interpretado como um operador binário comum; portanto, no seu caso original, a fim de chamar esse operador, você precisa fazer algo como
A a;
B* p = a->*2; // calls A::operator->*(int)
O que você lê na resposta do PIOTR se aplica ao construídas em operadores, não para o seu sobrecarregado. O que você chama em seu exemplo adicionado também é o construídas em Operador, não o seu sobrecarregado. Para chamar o operador sobrecarregado, você deve fazer o que eu faço no meu exemplo acima.
Outras dicas
Assim como .*
, ->*
é usado com ponteiros para membros. Há uma seção inteira On C ++ FAQ Lite Dedicado aos ponteiros a membros.
#include <iostream>
struct foo {
void bar(void) { std::cout << "foo::bar" << std::endl; }
void baz(void) { std::cout << "foo::baz" << std::endl; }
};
int main(void) {
foo *obj = new foo;
void (foo::*ptr)(void);
ptr = &foo::bar;
(obj->*ptr)();
ptr = &foo::baz;
(obj->*ptr)();
return 0;
}
Como qualquer outro Opperator, você também pode chamá -lo explicitamente:
a.operator->*(2);