Сохранение типа шаблона для преобразования Base обратно в Derived <T> - PullRequest
1 голос
/ 11 июля 2020

Итак, у меня есть эти классы:

class Base {

};
template <typename T>
class Derived<T>: public Base {

};

class util {
    public:
        template <typename T>
        void add(Derived<T> arg) {
           vec.push_back(arg);
        } 
        
        void start() {
            //cast back down to Derived<T>
        }
  
   private:
       std::vector<Base> vec;
};

В start() Я хочу вернуть его обратно к Derived<T>, но поскольку T может быть чем угодно, я не могу преобразовать его без типа . Мне интересно, нужно ли было хранить первый элемент информации типа ve c, например, typedef или что-то в этом роде, чтобы я мог использовать это в start()

1 Ответ

1 голос
/ 11 июля 2020

Прежде всего, у вас есть проблема с синтаксисом:

template <typename T>
class Derived<T>: public Base { // Won't compile, the class name is Derived, and it doesn't suppose to get specialized by T type
};

Правильный путь:

template <typename T>
class Derived : public Base {};

Для вашей проблемы вам не нужно преобразовывать его обратно в производный типа, вам просто нужно сделать свой вектор вектором указателей на базовый класс (и в функции вставки принять производный тип в качестве ссылки, чтобы передать его адрес вектору).
Примечание: в реализации вы увидите, что я передал shared_ptr - чтобы сделать право собственности на адрес очевидным, когда вы используете shared_ptr вместо небезопасных указателей в своем векторе (спасибо @ idclev463035818 за примечание) .

class util {
public:
    template <typename T>
    void add(std::shared_ptr<Derived<T>> arg) {
        vec.push_back(arg);
        // vec.push_back(&arg); // In case that you don't use shared_ptr, and pass arg by reference.
    }

    void start() {
        for (auto d : vec) { /* ...  */ }
    }

private:
    // Idea: std::vector<Base*> vec;
    std::vector<std::shared_ptr<Base>> vec; // For safe memory management
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...