異なるテンプレートタイプのサブクラスを持つポリモーフィズム

Cyber​​GK

テンプレート付きのクラスがあり、いくつかのクラスは彼から継承しています。テンプレートタイプを宣言せずに親クラスのインスタンスを作成し、テンプレートタイプを返す関数を呼び出したいと思います。

例:

class FatherWrap {
    virtual ~FatherWrap() = default;
};

template<typename T>
class FatherClass : public FatherWrap
{
    virtual T getValue();
};

class SonClass1 : public FatherClass<int>
{
    int getValue() override;
};

class SonClass2 : public FatherClass<string>
{
    string getValue() override;
};  

int main()
{
    FatherWrap* ch = new SonClass1();
    T a = ch->getValue; // What to do instead of T.
}
ギヨームラシコット

FatherWrap完全にスキップして、基本クラスにバリアントを返すようにすることができます

struct FatherClass : FatherWrap {
    virtual std::variant<int, std::string> getValue();
};

struct SonClass1 : FatherClass {
    std::variant<int, std::string> getValue() override {
        return "some text";
    }
};

struct SonClass2 : FatherClass {
    std::variant<int, std::string> getValue() override {
        return 95;
    }
};   

または、以下を使用するコードをテンプレート化することもできますSonClass

struct SonClass1 { // no parent.
    std::string getValue() {
        return "some text";
    }
};

struct SonClass2 { // no parent.
    int getValue() {
        return 95;
    }
};

template<typename T>
void useSonClass(T& son) {
    // value may be int or string.
    auto value = son.getValue();
}

int main() {
    SonClass1 sc1;
    SonClass2 sc2;

    useSonClass(sc1);
    useSonClass(sc2);
}

それを封じ込めたい場合は、バリアントを使用してください。

int main() {
    std::variant<SonClass1, SonClass2> sc = SonClass2{};

    std::visit(
        [](auto& sc) { useSonClass(sc); },
        sc
    );
}

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

ポリモーフィックサブクラスのテンプレートパラメータのタイプを確認する方法

分類Dev

2つの異なるクラスのランタイムポリモーフィズム

分類Dev

同じ署名を持つメンバー関数を呼び出すために、関数テンプレートインスタンスの代わりに継承とポリモーフィズムを使用するのはなぜですか?

分類Dev

異なるタイプの外部キーと既存のデータベースを持つ1対多のエンティティフレームワーク

分類Dev

インターフェイス内の異なるアクセサを持つ自動プロパティ

分類Dev

異なるメソッドとプロパティを持つ1つのインターフェイスからの異なるオブジェクト

分類Dev

異なるプレフィックスを持つセットテーブルのエンティティフレームワークデータベースの拳?

分類Dev

入力として異なるテンプレートパラメータを持つテンプレートクラスのフレンド関数

分類Dev

スレッドのサブクラスのオブジェクトをインスタンス化するために継承とポリモーフィズムを使用することの主な違いは何ですか?

分類Dev

スレッドのサブクラスのオブジェクトをインスタンス化するために継承とポリモーフィズムを使用することの主な違いは何ですか?

分類Dev

Javaの子タイプのパラメーターを持つポリモーフィズム

分類Dev

それぞれdbプレフィックスのない異なるデータベースからの2つのテーブルを持つクエリ

分類Dev

異なる値を持つ異なるディレクトリへのAnsibleコピーテンプレート

分類Dev

2つの異なるディスクドライブを搭載したラップトップで2つのオペレーティングシステムを維持するにはどうすればよいですか?

分類Dev

リストにサブタイプのポリモーフィズムとジェネリックを使用する方法は?

分類Dev

異なる非整数インデックスを持つ不等サイズのリストオブジェクトからデータフレームを作成する

分類Dev

ジャクソンプロパティのスプリングブートとポリモーフィズム

分類Dev

Haskellの異なるパラメータタイプを持つ多数のオブジェクトへのポリモーフィック関数の適用を乾かす方法はありますか?

分類Dev

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

分類Dev

Rubyスクレイプコードのリファクタリング(異なる属性を持つ)

分類Dev

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

分類Dev

デフォルトのテンプレートパラメータを持つポリモーフィッククラスのテンプレート推定は失敗します

分類Dev

ポリモーフィズムのベストプラクティス

分類Dev

ggternで異なるサイズのポイントを持つ三元グラフィックをプロットする方法は?

分類Dev

異なるデータを持つAngularJSディレクティブの複数のインスタンス?

分類Dev

属性セットランタイムを持つng-repeatを持つディレクティブのテンプレートのDOMを変更します

分類Dev

多面的な配列をフィルタリングしますが、パイプがエラーを返します-タイプ 'object'の異なるサポートオブジェクト '[objectObject]'が見つかりません

分類Dev

カスタムタイプがバインドされたシェイプレスマッピングとサブタイプポリモーフィズム

分類Dev

基本クラスオブジェクトの作成中のランタイムポリモーフィズム

Related 関連記事

  1. 1

    ポリモーフィックサブクラスのテンプレートパラメータのタイプを確認する方法

  2. 2

    2つの異なるクラスのランタイムポリモーフィズム

  3. 3

    同じ署名を持つメンバー関数を呼び出すために、関数テンプレートインスタンスの代わりに継承とポリモーフィズムを使用するのはなぜですか?

  4. 4

    異なるタイプの外部キーと既存のデータベースを持つ1対多のエンティティフレームワーク

  5. 5

    インターフェイス内の異なるアクセサを持つ自動プロパティ

  6. 6

    異なるメソッドとプロパティを持つ1つのインターフェイスからの異なるオブジェクト

  7. 7

    異なるプレフィックスを持つセットテーブルのエンティティフレームワークデータベースの拳?

  8. 8

    入力として異なるテンプレートパラメータを持つテンプレートクラスのフレンド関数

  9. 9

    スレッドのサブクラスのオブジェクトをインスタンス化するために継承とポリモーフィズムを使用することの主な違いは何ですか?

  10. 10

    スレッドのサブクラスのオブジェクトをインスタンス化するために継承とポリモーフィズムを使用することの主な違いは何ですか?

  11. 11

    Javaの子タイプのパラメーターを持つポリモーフィズム

  12. 12

    それぞれdbプレフィックスのない異なるデータベースからの2つのテーブルを持つクエリ

  13. 13

    異なる値を持つ異なるディレクトリへのAnsibleコピーテンプレート

  14. 14

    2つの異なるディスクドライブを搭載したラップトップで2つのオペレーティングシステムを維持するにはどうすればよいですか?

  15. 15

    リストにサブタイプのポリモーフィズムとジェネリックを使用する方法は?

  16. 16

    異なる非整数インデックスを持つ不等サイズのリストオブジェクトからデータフレームを作成する

  17. 17

    ジャクソンプロパティのスプリングブートとポリモーフィズム

  18. 18

    Haskellの異なるパラメータタイプを持つ多数のオブジェクトへのポリモーフィック関数の適用を乾かす方法はありますか?

  19. 19

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

  20. 20

    Rubyスクレイプコードのリファクタリング(異なる属性を持つ)

  21. 21

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

  22. 22

    デフォルトのテンプレートパラメータを持つポリモーフィッククラスのテンプレート推定は失敗します

  23. 23

    ポリモーフィズムのベストプラクティス

  24. 24

    ggternで異なるサイズのポイントを持つ三元グラフィックをプロットする方法は?

  25. 25

    異なるデータを持つAngularJSディレクティブの複数のインスタンス?

  26. 26

    属性セットランタイムを持つng-repeatを持つディレクティブのテンプレートのDOMを変更します

  27. 27

    多面的な配列をフィルタリングしますが、パイプがエラーを返します-タイプ 'object'の異なるサポートオブジェクト '[objectObject]'が見つかりません

  28. 28

    カスタムタイプがバインドされたシェイプレスマッピングとサブタイプポリモーフィズム

  29. 29

    基本クラスオブジェクトの作成中のランタイムポリモーフィズム

ホットタグ

アーカイブ