C ++テンプレート、ポリモーフィズム、およびテンプレート共分散

ルドビシオ

次のような「ラッパー」テンプレートがあります。

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]

編集
0

コメントを追加

0

関連記事

分類Dev

C ++テンプレート共分散

分類Dev

C++ コンテナ、共分散、テンプレート

分類Dev

c ++デコレータパターン、テンプレートを使用した静的ポリモーフィズム、およびコールバックメソッドの登録

分類Dev

一緒に使用されるC ++テンプレートポリモーフィズム

分類Dev

ポリモーフィズムによるC ++テンプレートメソッドのオーバーロードとクラスアクセス

分類Dev

ポリモーフィズムとC ++のクラステンプレートからのメソッドのオーバーライド

分類Dev

C ++テンプレートの特殊化/部分的および完全

分類Dev

C ++テンプレートの特殊化char *およびValgrind

分類Dev

Rcppによって呼び出されるc ++カウントアルゴリズムテンプレート

分類Dev

コンテナおよびコンテナコンテンツタイプC ++のテンプレート

分類Dev

タイプおよび非タイプテンプレートのC ++自動

分類Dev

C ++の継承、テンプレート、およびオーバーライド

分類Dev

複数のタイプを含むタイプリストのc#MVCエンティティフレームワークモデルプロパティ

分類Dev

ポインターおよびcスタイルの配列変数用の専用テンプレート

分類Dev

C ++で共分散テンプレート関数を定義する正しい方法

分類Dev

C ++テンプレート関数-複数のタイプ、デフォルトおよび...引数?

分類Dev

テンプレートfuncparamのC ++ 17invoke_resultおよびstatic_assert

分類Dev

std :: functionおよびstd :: bindでC ++テンプレートを使用する

分類Dev

テンプレートでのC ++のメモリリーク

分類Dev

C ++標準スレッドおよびリストセグメンテーションフォールト(コアダンプ)

分類Dev

C#の静的および動的ポリモーフィズム

分類Dev

C ++のテンプレート/リファレンス

分類Dev

C ++ STLコンテナのポリモーフィズム

分類Dev

セット<T>対セット<T、コンパレータ>(C ++ポリモーフィズム)

分類Dev

C ++ラムダを保存する方法:テンプレートと非テンプレートフォーム?

分類Dev

C ++テキストフィルタリングテンプレートライブラリ/エンジン

分類Dev

C ++でのアーリーバインディングとレイトバインディング+ポリモーフィズム

分類Dev

C ++テンプレートを使用した共変/反変の動作の指定

分類Dev

C ++のオーバーロードおよびテンプレート化されたファンクターとその引数の完全な転送

Related 関連記事

  1. 1

    C ++テンプレート共分散

  2. 2

    C++ コンテナ、共分散、テンプレート

  3. 3

    c ++デコレータパターン、テンプレートを使用した静的ポリモーフィズム、およびコールバックメソッドの登録

  4. 4

    一緒に使用されるC ++テンプレートポリモーフィズム

  5. 5

    ポリモーフィズムによるC ++テンプレートメソッドのオーバーロードとクラスアクセス

  6. 6

    ポリモーフィズムとC ++のクラステンプレートからのメソッドのオーバーライド

  7. 7

    C ++テンプレートの特殊化/部分的および完全

  8. 8

    C ++テンプレートの特殊化char *およびValgrind

  9. 9

    Rcppによって呼び出されるc ++カウントアルゴリズムテンプレート

  10. 10

    コンテナおよびコンテナコンテンツタイプC ++のテンプレート

  11. 11

    タイプおよび非タイプテンプレートのC ++自動

  12. 12

    C ++の継承、テンプレート、およびオーバーライド

  13. 13

    複数のタイプを含むタイプリストのc#MVCエンティティフレームワークモデルプロパティ

  14. 14

    ポインターおよびcスタイルの配列変数用の専用テンプレート

  15. 15

    C ++で共分散テンプレート関数を定義する正しい方法

  16. 16

    C ++テンプレート関数-複数のタイプ、デフォルトおよび...引数?

  17. 17

    テンプレートfuncparamのC ++ 17invoke_resultおよびstatic_assert

  18. 18

    std :: functionおよびstd :: bindでC ++テンプレートを使用する

  19. 19

    テンプレートでのC ++のメモリリーク

  20. 20

    C ++標準スレッドおよびリストセグメンテーションフォールト(コアダンプ)

  21. 21

    C#の静的および動的ポリモーフィズム

  22. 22

    C ++のテンプレート/リファレンス

  23. 23

    C ++ STLコンテナのポリモーフィズム

  24. 24

    セット<T>対セット<T、コンパレータ>(C ++ポリモーフィズム)

  25. 25

    C ++ラムダを保存する方法:テンプレートと非テンプレートフォーム?

  26. 26

    C ++テキストフィルタリングテンプレートライブラリ/エンジン

  27. 27

    C ++でのアーリーバインディングとレイトバインディング+ポリモーフィズム

  28. 28

    C ++テンプレートを使用した共変/反変の動作の指定

  29. 29

    C ++のオーバーロードおよびテンプレート化されたファンクターとその引数の完全な転送

ホットタグ

アーカイブ