Задать вопрос
sdevalex
@sdevalex

C++ список ссылок на функции, возвращающие новые экземпляры разнотипных классов?

Как в таком коде можно вызвать функции по ссылкам из handlers? Или с этим я сильно закрутил?

namespace RequestHandlers
{
    class Base
    {
        public:
            virtual Response* processing(Request* request);
    };

    class Info : public Base
    {
    };

    class List : public Base
    {
    };
}

template<class T>
T* createInstance()
{
    return new T();
}

QMap<unsigned int, void*> handlers;

handlers[1] = &createInstance<RequestHandlers::Info>;
handlers[2] = &createInstance<RequestHandlers::List>;

//handlers[1]() вызывает ошибку
  • Вопрос задан
  • 2971 просмотр
Подписаться 2 Оценить Комментировать
Решения вопроса 1
barmaley_exe
@barmaley_exe
Какую ошибку?
createInstance возвращает указатель, а Вы берёте его адрес и записываете в handlers. Вы собираетесь вызывать указатель?
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
sdevalex
@sdevalex Автор вопроса
В итоге получился вот такой вот код. Может есть способ как-то неявно добавлять новые типы? Т.е. избавиться от явного вызова Base::registerType().
class Info : public Base
{
};

class List : public Base
{
};

Base::registerType<Info>();
Base::registerType<List>();

Base::createInstance(1)->processing(new Request);
Ответ написан
@rtorsten
Можно добавить в каждый класс статический инициализатор.

class bar : public Base
{
public:
        // ...
	class registrator {
	public:
		registrator() 
		{
			Base::registerType<bar>();
		}
	};
	static registrator _registrator;
};
bar::registrator bar::_registrator;

Обычно для этого пишут макрос (а точнее 2 макроса, 1ый для определения регистратора, 2ой для определения статического объекта), т.к. подобные инициализаторы надо добавить в каждый класс, который вы хотите неявно регистрировать.

И не забудьте (может Вы и не забыли) в Base или от чего там наследуется handlers добавить виртуальный деструктор.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы