typeパラメーターを知らなくても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();