std :: enable :: ifおよびstd :: is_base_ofを使用して継承を制約します

anc

次のシナリオを考えます。

class A {};
class B : public A {};
class C : public A {};
class D : public A {};

template<typename T/*std::enable_if and std::is_base_of here*/> class X {};

Xを宣言するとき

次に、typename Tを強制的にAのサブクラスにするように制約したいと思います。そうしないと、コンパイルエラーが発生します。

int main()
{
   X<B> x1 = {}; //should work;
   X<C> x2 = {}; //should work;
   X<D> x2 = {}; //should work;
   X<std::string> = {};  //should generate a compiling error;
   X<int> = {};  //should generate a compiling error;
};
NathanOliver

使用するための正しい構文は次のとおりenable_ifです。

template<typename T, std::enable_if_t<std::is_base_of_v<A, T>, bool> = true> 
class X {};

そして今、ifATthen std::is_base_of_v<A, T>istruestd::enable_if_tbecomesのベースでありそれにbool値を与えますtrueAがのベースでない場合T、条件はfalseでstd::enable_if_t結果はゼロになり、テンプレートは実行可能な候補として破棄され、コンパイラエラーが生成されます。

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

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

編集
0

コメントを追加

0

関連記事

分類Dev

SFINAEのstd :: enable_if_t&std :: is_base_ofを使用して、コンパイル時の継承を確認するにはどうすればよいですか?

分類Dev

std :: enable_ifおよびstd :: shared_ptr

分類Dev

libc ++の不完全なタイプのstd :: enable_ifおよびstd :: is_default_constructibleを使用したSFINAE

分類Dev

テンプレートパラメータとしてstd :: enable_ifおよびstd :: is_arithmeticの問題

分類Dev

std :: bindおよびstd :: function with polymorphism、base class

分類Dev

C ++ 11:継承でstd :: mem_fnおよびstd :: bindを使用する方法

分類Dev

std :: enable_ifおよびstd :: decayを使用したc ++クラスコンストラクタテンプレート

分類Dev

std :: sscanfおよびstd :: stringを使用するC ++

分類Dev

Errors with std::enable_if<>

分類Dev

std :: bindをstd :: functionおよびstd :: mapと一緒に使用する方法

分類Dev

std :: setおよびstd :: unordered_setは、emplace()を使用して要素をどのように構成しますか?

分類Dev

std :: mapおよびstd :: variantを含む不完全な型

分類Dev

std :: enable_shared_from_thisからの継承

分類Dev

std :: vectorおよびstd :: string再割り当て戦略

分類Dev

std :: visitおよびstd :: variantの使用法

分類Dev

std :: copy、std :: copy_backwardおよび重複する範囲

分類Dev

std :: listに対するstd :: prevおよびstd :: nextの有効性

分類Dev

std :: enable_ifとstd :: enable_if_tの違いは何ですか?

分類Dev

std :: is_base_ofおよび仮想基本クラス

分類Dev

std :: enable_if内でsizeof ...を使用する

分類Dev

std :: equalおよびequality演算子を使用した比較

分類Dev

C ++ 11:std :: threadおよびlambda関数を使用したSegfault

分類Dev

std::conditional vs std::enable_if

分類Dev

std :: conditionalとstd :: enable_if

分類Dev

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

分類Dev

通常の関数でC ++ std :: enable_ifを使用していますか?

分類Dev

std :: enable_ifはどのように機能しますか?

分類Dev

Template specialization with std::enable_if<>

分類Dev

c ++ std :: enable_if .... else?

Related 関連記事

  1. 1

    SFINAEのstd :: enable_if_t&std :: is_base_ofを使用して、コンパイル時の継承を確認するにはどうすればよいですか?

  2. 2

    std :: enable_ifおよびstd :: shared_ptr

  3. 3

    libc ++の不完全なタイプのstd :: enable_ifおよびstd :: is_default_constructibleを使用したSFINAE

  4. 4

    テンプレートパラメータとしてstd :: enable_ifおよびstd :: is_arithmeticの問題

  5. 5

    std :: bindおよびstd :: function with polymorphism、base class

  6. 6

    C ++ 11:継承でstd :: mem_fnおよびstd :: bindを使用する方法

  7. 7

    std :: enable_ifおよびstd :: decayを使用したc ++クラスコンストラクタテンプレート

  8. 8

    std :: sscanfおよびstd :: stringを使用するC ++

  9. 9

    Errors with std::enable_if<>

  10. 10

    std :: bindをstd :: functionおよびstd :: mapと一緒に使用する方法

  11. 11

    std :: setおよびstd :: unordered_setは、emplace()を使用して要素をどのように構成しますか?

  12. 12

    std :: mapおよびstd :: variantを含む不完全な型

  13. 13

    std :: enable_shared_from_thisからの継承

  14. 14

    std :: vectorおよびstd :: string再割り当て戦略

  15. 15

    std :: visitおよびstd :: variantの使用法

  16. 16

    std :: copy、std :: copy_backwardおよび重複する範囲

  17. 17

    std :: listに対するstd :: prevおよびstd :: nextの有効性

  18. 18

    std :: enable_ifとstd :: enable_if_tの違いは何ですか?

  19. 19

    std :: is_base_ofおよび仮想基本クラス

  20. 20

    std :: enable_if内でsizeof ...を使用する

  21. 21

    std :: equalおよびequality演算子を使用した比較

  22. 22

    C ++ 11:std :: threadおよびlambda関数を使用したSegfault

  23. 23

    std::conditional vs std::enable_if

  24. 24

    std :: conditionalとstd :: enable_if

  25. 25

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

  26. 26

    通常の関数でC ++ std :: enable_ifを使用していますか?

  27. 27

    std :: enable_ifはどのように機能しますか?

  28. 28

    Template specialization with std::enable_if<>

  29. 29

    c ++ std :: enable_if .... else?

ホットタグ

アーカイブ