• Class / Function / Type

      std::
    • Header file

      <>
    • Other / All

    最終更新日時(UTC):
    が更新

    履歴 編集

    class template
    <type_traits>

    std::is_abstract

    namespace std {
      template <class T>
      struct is_abstract;
    
      template <class T>
      inline constexpr bool is_abstract_v = is_abstract<T>::value; // C++17
    }
    

    概要

    Tが抽象クラスか調べる。

    要件

    Tが非共用体のクラスである場合、その型は完全型でなければならない。

    効果

    is_abstractは、型Tが抽象クラス (cv修飾を許容する) であるならばtrue_typeから派生し、そうでなければfalse_typeから派生する。

    備考

    抽象クラスとは、少なくとも一つの純粋仮想関数を持つクラスである。

    抽象クラスそれ自体はインスタンス化できず、そのクラスから派生して純粋仮想関数をオーバーライドし、その派生したクラスをインスタンス化しなければならない。

    #include <type_traits>
    
    struct abstract_class {
      virtual void member() = 0; // 純粋仮想関数を持つ
    };
    class non_abstract_class{};
    
    static_assert(std::is_abstract<abstract_class>::value == true, "value == true, abstract_class is abstract");
    static_assert(std::is_same<std::is_abstract<abstract_class>::value_type, bool>::value, "value_type == bool");
    static_assert(std::is_same<std::is_abstract<abstract_class>::type, std::true_type>::value, "type == true_type");
    static_assert(std::is_abstract<abstract_class>() == true, "is_abstract<abstract_class>() == true");
    
    static_assert(std::is_abstract<non_abstract_class>::value == false, "value == false, non_abstract_class is not abstract");
    static_assert(std::is_same<std::is_abstract<non_abstract_class>::value_type, bool>::value, "value_type == bool");
    static_assert(std::is_same<std::is_abstract<non_abstract_class>::type, std::false_type>::value, "type == false_type");
    static_assert(std::is_abstract<non_abstract_class>() == false, "is_abstract<non_abstract_class>() == false");
    
    static_assert(std::is_abstract<const volatile abstract_class>::value == true, "const volatile abstract_class is abstract");
    static_assert(std::is_abstract<abstract_class&>::value == false, "abstract_class& is not abstract");
    
    int main(){}
    

    出力

    バージョン

    言語

    • C++11

    処理系

    • GCC: 4.3.4 , 4.5.3 , 4.6.2 , 4.7.0
    • Visual C++: 2008 (std::tr1) , 2010 , 2012 , 2013 , 2015

    備考

    上の例でコンパイラによってはエラーになる。GCC 4.3.4, 4.5.3, Visual C++ 2010 は integral_constantoperator bool() を持っていないためエラーになる。

    参照