Что такое оператор ->* в C++?
C++ продолжает меня удивлять. Сегодня я узнал об операторе ->*. Он перегружен, но я понятия не имею, как его вызвать. Мне удается перегрузить его в моем классе, но я понятия не имею, как это назвать.
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;
}
Правка:
Спасибо за ответ. Для вызова перегруженной функции я пишу
void main()
{
A a;
A*p = &a;
a + 2;
a->a;
A::a_func f = &A::ff;
(&a->*f)();
(a->*f); //this
}
3 ответа:
Перегруженный оператор
->*
является бинарным оператором (в то время как.*
не перегружается). Он интерпретируется как обычный двоичный оператор, поэтому в исходном случае для вызова этого оператора вам нужно сделать что-то вродеA a; B* p = a->*2; // calls A::operator->*(int)
То, что Вы читаете в ответе Петра, относится к встроенным операторам, а не к вашему перегруженному. То, что вы называете в добавленном примере, также является встроенным оператором , а не перегруженным. Для того чтобы вызвать перегруженного оператора вы должны делать то, что я делаю в моем примере выше.
Так же, как
.*
,->*
используется с указателями на члены. Существует целый раздел на C++ FAQ LITE, посвященный указателям на членов.#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; }