C ++ Можно ли построить список типов шаблонов? - PullRequest
3 голосов
/ 25 июня 2019

Так что я не знаю, возможно ли это, но у меня есть настройка, которая выглядит примерно так:

template <class T>
struct Something;

struct Example {
    //not sure how this should be defined
    //I was thinking void*, but I can't use pointers as the 'Something' class moves around the instances
    //and I don't want to have to constantly update the pointers.
    std::vector<?> addedTypes;

    template<typename T>
    void addThing() {
        addedTypes.push_back(T);
        Something<T>::addThing(*this);
    }

    void destroy() {
        for (auto T : addedTypes) {
            Something<T>::removeThing(*this);
        }
    }
};

template <class T>
struct Something {
    static void addThing(Example e) {/*...*/}
    static void removeThing(Example e) {/*...*/}
};

По сути, я хочу знать, как я могу составить списоктипы, которые были добавлены в цикл так, чтобы позже я мог вызвать статическую функцию удаления?

Редактировать: Добавление немного больше информации, как это предлагается в комментариях.

Это только для примера, это на самом делесистема компонентов объекта, где «Пример» является объектом, а «Нечто» является компонентом CRTP.Вся логика хранится в компонентах, кроме идентификатора и некоторых вспомогательных функций в сущности.Единственная недостающая часть - это способ уничтожить компоненты (различных типов) из сущности (я могу сделать это уже из компонентов, но без типов, я не уверен, как это сделать из сущности.

По той причине, что статические функции вызываются в классе Something, они взаимодействуют с другими членами статического класса (например, std::vector<T> list) и не затрагивают состояние экземпляра.

1 Ответ

6 голосов
/ 25 июня 2019

Это не строит список типа, но предоставляет список «для удаления».

Я использую std::function здесь, может быть, создание IRemover будет более целесообразным для вас (или достаточно простого указателя на функцию):

template <class T>
struct Something;

struct Example {
    std::vector<std::function<void(Example&)>> removers;

    template<typename T>
    void addThing() {
        removers.push_back(&Something<T>::removeThing);
        Something<T>::addThing(*this);
    }

    void destroy() {
        for (auto& f : removers) {
            f(*this);
        }
        removers.clear();
    }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...