Pregunta

C ++ continúa sorprendiéndome. Hoy me enteré del operador ->*. Es sobrecargable pero no tengo idea de cómo invocarlo. Me las arreglo para sobrecargarlo en mi clase, pero no tengo ni idea de cómo llamarlo.

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:

Gracias a la respuesta. Para llamar a la función sobrecargada, escribo

void main()
{
    A a;
    A*p = &a;
    a + 2;
    a->a;
    A::a_func f = &A::ff;
    (&a->*f)();
    (a->*f); //this
}
¿Fue útil?

Solución

El sobrecargado ->* El operador es un operador binario (mientras .* no es sobrecargable). Se interpreta como un operador binario ordinario, por lo que en su caso original para llamar a ese operador debe hacer algo como

A a;
B* p = a->*2; // calls A::operator->*(int)

Lo que lees en la respuesta del piotr se aplica a la incorporado operadores, no a su sobrecargado. Lo que llamas en tu ejemplo adicional es también el incorporado operador, no su sobrecargado. Para llamar al operador sobrecargado, debe hacer lo que hago en mi ejemplo anterior.

Otros consejos

Al igual que .*, ->* se usa con punteros para miembros. Hay una sección completa En C ++ Preguntas frecuentes de Lite dedicado a consejos a miembros.

#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 cualquier otro opperator, también puede llamarlo explícitamente:

a.operator->*(2);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top