Как обойти функции через шаблоны? - PullRequest
0 голосов
/ 25 июня 2018

В настоящее время пытаюсь реализовать обработчик событий для проекта SDL.Общая идея заключается в том, что события пользовательского ввода будут обрабатываться с помощью Message объектов, которые смогут переносить обратные вызовы с разными сигнатурами. В настоящее время у меня есть следующее:

#pragma once
#include<functional>

#include"Entity.h"
#include"Enums.h"

typedef std::function<void(void)> VoidCallback;
typedef std::function<void(const Entity& entity)> EntityCallback;

template<typename Functor>
class Message
{
private:
    MessageType message;

public:
    Message(MessageType message, Functor callback) :message(message), callback(callback) {};
    ~Message();
};

Однако такое расположение делаеттрудно передать разные типы обратных вызовов разным слушателям.Текущая реализация слушателя -

#include"Message.h"

class Listener
{
public:
    virtual void onNotify(Message<>& event) = 0;
};

, что приводит к ошибкам.Как лучше всего решить эту проблему?

Ответы [ 2 ]

0 голосов
/ 25 июня 2018

Виртуальная функция не может быть шаблонизирована.

Виртуальная функция вызывается через vtable, который в основном является массивом указателей на функции.Каждый виртуальный метод в базовом классе занимает место в виртуальной таблице.Очевидно, что размер виртуальной таблицы должен быть известен во время компиляции, поскольку он является частью определения объекта.

class Base {
public:
    virtual void hello(){};
    virtual void bye(){};   
}

vtable может выглядеть следующим образом:

  • Указатель на hello.
  • Указатель на bye.

Итак, виртуальной таблице нужен указатель на две функции.

Теперь, если hello() или bye()быть шаблонным, как мы могли бы создать vtable?

  • Указатель на hello<int>()
  • Указатель на hello<char>().

Мы не можем знать заранее все варианты шаблонной функции, поэтому она неможно построить vtable.

0 голосов
/ 25 июня 2018

У вас не может быть шаблонной виртуальной функции

Может ли шаблон функции-члена класса C ++ быть виртуальным?

#include "Message.h"

class Listener
{
public:

    //you may use a template function as such
    template<class func>
    void onNotify(Message<func>& event) { /*must implement*/ }

    //or specialize for specific function calls
    virtual void onNotify(Message<some_known_func>& even) = 0;
};

Если вы хотите использовать методы шаблона сВиртуальные функции, которые вы можете быть заинтересованы в CRTP .(CRTP позволяет суперклассу вызывать методы подклассов)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...