Могу ли я удерживать shared_ptr, не зная параметра типа? [дубликат]

Aug 17 2020

Я бы хотел провести shared_ptrкурс по шаблону. Однако я не хочу делать класс B и классом-шаблоном. В моем понимании shared_ptr любого типа будет иметь одинаковую структуру памяти. Итак, мне интересно какое-либо обходное решение в этом сценарии?

template<T>
class A {
...
};

class B {
...
  std::shared_ptr<A<T>> ptr;
}

Ответы

2 AtnNn Aug 17 2020 at 17:19

Когда тип не имеет значения, voidможно использовать.

template <typename>
class C {};

std::shared_ptr<void> p = std::make_shared<C<int>>();

Добавление мономорфного базового класса позволяет ограничить тип, который может быть сохранен.

class AnyC {};

template <typename>
class C : public AnyC {};

std::shared_ptr<AnyC> p = std::make_shared<C<int>>();

Если этот базовый класс имеет виртуальные методы, их можно вызывать через указатель.

class AnyC {
    virtual void f();
};

template <typename>
class C : public AnyC {
    void f() override;
};

std::shared_ptr<AnyC> p = std::make_shared<C<int>>();
p->f();