c ++ указатели на операторы - PullRequest
11 голосов
/ 14 ноября 2010

Я хочу написать указатель на c ++ (или на c ++ 0x), который будет указывать на оператор класса, скажем, A или B. Есть ли способ сделать это?

OfКонечно, есть синтаксис типа

int (A::*_p) ();

, но он не решает эту проблему.Я хочу сделать общий указатель, не указывая для него базовый класс - только указатель для «операторной функции»

#include <thread>
#include <iostream>

using namespace std;

class A
{
public:
    int operator()()
    {
        return 10;
    }
};

class B
{
public:
    int operator()()
    {
        return 11;
    }
};

int main()
{
 A a;
 int (*_p) ();
 _p = a.operator();
 cout << _p();

 B b;
 _p = b.operator();
 cout << _p();
}

1 Ответ

22 голосов
/ 14 ноября 2010

Нет, вы не можете этого сделать.Тип класса является частью типа функции-члена оператора.

Тип A::operator()() отличается от типа B::operator()().Первый тип int (A::*)(), а второй тип int (B::*)().Эти типы совершенно не связаны.

Самое близкое, что вы можете получить, это использовать что-то вроде обёртки полиморфной функции C ++ 0x function (встречается в C ++ 0x, C ++ TR1 и Boost) и с помощьюbind для привязки указателя функции-члена к экземпляру класса:

std::function<int()> _p;

A a;
_p = std::bind(&A::operator(), a);
std::cout << _p();

B b;
_p = std::bind(&B::operator(), b);
std::cout << _p();
...