Способ фильтрации объектов по типу на фабрикеC++

Программы на C++. Форум разработчиков
Anonymous
Способ фильтрации объектов по типу на фабрике

Сообщение Anonymous »

У меня есть фабрика, содержащая карту с именами объектов в качестве ключа и указателем для функции значения

Код: Выделить всё

template
static T* makeObj()
{
return new T();
}

using createFunction = std::function;
map types;

template
static void add(const std::string& name)
{
types.insert(name, makeObj);
}
Я хочу добавить дополнительную функцию для получения отфильтрованного списка типов (получить список унаследованных классов), примерно так:

Код: Выделить всё

template
static std::list getFilteredListOfTypes()
{
}
Вопрос в том, как это сделать.
Первая идея — создать карту со структурой в качестве значения и сохранить там объект соответствующего типа, я могу использовать < strong>dynamic_cast и проверяем все типы, но я сомневаюсь, что создание объекта — хорошая идея.
Другой способ — использовать std::is_base_of:

Код: Выделить всё

template< class Base, class Derived >
struct is_base_of;
is_base_of принимает два типа: класс Base я могу получить из моего getFilteredListOfTypes, но как получить производный класс? Создайте объект и используйте decltype... но здесь снова создается объект.
Есть ли способ создать такую ​​функцию фильтра без создания объектов?Это плохая идея — создать здесь объект? Разве это плохая идея — создавать объект для каждого элемента карты? Меня немного пугает ситуация, когда на заводе будут сотни совсем не маленьких типов.

Подробнее здесь: https://stackoverflow.com/questions/786 ... he-factory

Вернуться в «C++»