次のような「ラッパー」テンプレートがあります。
template <typename T>
class Wrapper {
virtual T* get() = 0;
}
次に、次の継承スキームがあります。
class A {
// things
}
class B : public A {
// more things
}
そのラッパーを使用する別のクラスがあります。
class Worker {
void work(Wrapper<A>* wa){
A* a = wa->get();
//do stuff with a.
}
}
行うことができるすべてはA*
、で行うことができますB*
、しかし、私は渡すことはできませんWrapper<B>*
としてWrapper<A>*
労働者へ。これを許可する方法はありますか?
C ++の概念について読んだことがありますが、それらがどのように問題を解決するのかわかりません。
各クラスがそのベースを報告する場合:
class A {
using Base = void;
// things
}
class B : public A {
using Base = A;
// more things
}
あなたができる
template<typename T>
class Wrapper : public EmptyForVoid<T::Base>::Type
そしてEmptyForVoid
、基本クラスの選択に使用します。
template<typename T>
struct EmptyForVoid { using Type = T; };
template<>
struct EmptyForVoid<void> { struct Type {}; };
これにより、はWrapper
ラップするタイプと同じ継承ツリーに従うようになります。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加