Я хочу написать абстрактный класс с именем 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 ()?Или я пытаюсь сделать невозможное здесь?