Создайте виртуальную функцию, которая возвращает указатель на функцию-член - PullRequest
0 голосов
/ 22 ноября 2018

Я хочу написать абстрактный класс с именем COMMUNICATOR, который имеет виртуальную функцию get_func().

class COMMUNICATOR : public QObject{
public:
    virtual <what type???> get_func() = 0;
};

Теперь предположим, INT_SENDER, INT_RECEIVER, STR_SENDER и STR_RECEIVERвсе происходят от COMMUNICATOR.Каждый из них предоставляет свою собственную реализацию get_func (), и их можно использовать так:

COMMUNICATOR *int_sender = new INT_SENDER;
COMMUNICATOR *int_receiver = new INT_RECEIVER;

COMMUNICATOR *str_sender = new STR_SENDER;
COMMUNICATOR *str_receiver = new STR_RECEIVER;

//INT_SENDER::get_func() and INT_RECEIVER::get_func() both return a member function pointer of signature void(*)(int)
connect( int_sender, int_sender->get_func(), int_receiver, int_receiver->get_func() );

//STR_SENDER::get_func() and STR_RECEIVER::get_func() both return a member function pointer of signature void(*)(std::string)
connect( str_sender, str_sender->get_func(), str_receiver, str_receiver->get_func() );

Чего я хочу добиться с помощью этого дизайна:

(1) Чтобы дать всемклассы, которые наследуются от COMMUNICATOR того же интерфейса: функция get_func ()

(2) Использование COMMUNICATOR и его производных классов не требует обработки сигнатуры функции, возвращаемой get_func ().Вместо этого указатели на функции передаются непосредственно в connect ();

Есть ли какой-нибудь хак для достижения того, чего я хочу, например, заставить get_func () вернуть какой-нибудь объект-обертку, стирающий тип, из которого я могу вывести функциюуказатель на connect ()?Или я пытаюсь сделать невозможное здесь?

...