名前空間
変種
操作

機能テスト勧告 (C++20)

提供: cppreference.com
< cpp

C++ 標準および実験的な機能の部分的な実装の進捗を追跡するために、機能テスト勧告は、各機能の存在を検出するためのシンプルかつ移植性のある方法である (処理系によって定義されていれば)、プリプロセッサマクロの集合を提供します。

目次

[編集] 関数マクロ

機能テスト関数マクロは #if および #elif の式内で展開できます。 これらは #ifdef#ifndef および defined によって定義済みのマクロとして扱われますが、それ以外のいかなる場所でも使用することはできません。

[編集] ヘッダの検索

__has_include( header-name ) (1)

#include 指令が解釈するのと同じ方法でヘッダファイル名のチェックを行います。

そのヘッダが見付かる場合は 1 に、そうでなければ 0 に展開されます。

ノート: __has_include は C++17 の一部です。

[編集] 属性

__has_cpp_attribute( attribute-token )

属性の存在をチェックします。

標準の属性の場合は、その属性がワーキングドラフトに追加された年と月に展開されます。 ベンダ固有の属性は非ゼロの値によって判定されます。

[編集] 言語とライブラリの機能

以下のマクロは、その機能がワーキングドラフトに含まれた年と月に対応する数値に展開されます。

機能が大きく変わるときは、それを受けてマクロも更新されます。

マクロの名前 機能 ヘッダ 標準/TS
__cpp_aggregate_bases 集成体初期化の拡張 201603 定義済み (C++17)
__cpp_aggregate_nsdmi メンバ初期化子と集成体 201304 定義済み (C++14)
__cpp_alias_templates テンプレートエイリアス 200704 定義済み (C++11)
__cpp_aligned_new 過剰にアラインされたデータのための動的メモリ確保 201606 定義済み (C++17)
__cpp_attributes 属性 200809 定義済み (C++11)
__cpp_binary_literals C++ コア言語における2進リテラル 201304 定義済み (C++14)
__cpp_capture_star_this [=,*this] としての値による *this のラムダキャプチャ 201603 定義済み (C++17)
__cpp_concepts 制約とコンセプト 201507 定義済み (concepts TS)
__cpp_constexpr constexpr 200704 定義済み (C++11)
constexpr 関数および constexpr メンバ関数に対する制約の緩和および暗黙の const 201304 定義済み (C++14)
constexpr ラムダ 201603 定義済み (C++17)
__cpp_decltype decltype 200707 定義済み (C++11)
__cpp_decltype_auto 普通の関数に対する戻り値型の推定 201304 定義済み (C++14)
__cpp_deduction_guides クラステンプレートに対するテンプレートの実引数推定 201703 定義済み (C++17)
__cpp_delegating_constructors 委譲コンストラクタ 200604 定義済み (C++11)
__cpp_enumerator_attributes 列挙子に対する属性 201411 定義済み (C++17)
__cpp_exceptions 例外処理 199711 定義済み (c++98)
__cpp_explicit_bool explicit(bool) 201806 定義済み (c++20)
__cpp_fold_expressions 畳み込み式 201603 定義済み (C++17)
__cpp_generic_lambdas 総称 (多相) ラムダ式 201304 定義済み (C++14)
__cpp_guaranteed_copy_elision 単純化された値カテゴリを通した保証されたコピー省略 201606 定義済み (C++17)
__cpp_hex_float 16進浮動小数点リテラル 201603 定義済み (C++17)
__cpp_if_constexpr constexpr if 201606 定義済み (C++17)
__cpp_inheriting_constructors 継承コンストラクタ 200802 定義済み (C++11)
継承コンストラクタの文面の修正 201511 定義済み (C++17)
__cpp_init_captures 汎用化されたラムダキャプチャ 201304 定義済み (C++14)
__cpp_initializer_lists 初期化子リスト 200806 定義済み (C++11)
__cpp_inline_variables インライン変数 201606 定義済み (C++17)
__cpp_lambdas ラムダ式 200907 定義済み (C++11)
__cpp_lib_addressof_constexpr constexpr std::addressof 201603 <memory> (C++17)
__cpp_lib_allocator_traits_is_always_equal std::allocator_traits::is_always_equal 201411 <memory> <scoped_allocator> <string> <deque> <forward_list> <list> <vector> <map> <set> <unordered_map> <unordered_set> (C++17)
__cpp_lib_any std::any 201606 <any> (C++17)
__cpp_lib_apply std::apply 201603 <tuple> (C++17)
__cpp_lib_array_constexpr std::reverse_iteratorstd::move_iteratorstd::array および範囲アクセスへの constexpr 修飾子の追加 201603 <iterator> <array> (C++17)
__cpp_lib_as_const std::as_const 201510 <utility> (C++17)
__cpp_lib_atomic_is_always_lock_free constexpr atomic<T>::is_always_lock_free 201603 <atomic> (C++17)
__cpp_lib_atomic_ref std::atomic_ref 201806 <atomic> (C++20)
__cpp_lib_bit_­cast std::bit_cast 201806 <bit> (C++20)
__cpp_lib_bool_constant std::bool_constant 201505 <type_traits> (C++17)
__cpp_lib_boyer_moore_searcher 検索子 201603 <functional> (C++17)
__cpp_lib_byte バイト型の定義 201603 <cstddef> (C++17)
__cpp_lib_chrono std::chrono::duration および std::chrono::time_point に対する丸め関数 201510 <chrono> (C++17)
std::chrono::duration および std::chrono::time_point のすべてのメンバ関数を constexpr にする 201611 <chrono> (C++17)
__cpp_lib_chrono_udls 時間型に対するユーザ定義リテラル 201304 <chrono> (C++14)
__cpp_lib_clamp 一組の境界値の間に値をクランプするアルゴリズム (std::clamp) 201603 <algorithm> (C++17)
__cpp_lib_complex_udls std::complex に対するユーザ定義リテラル 201309 <complex> (C++14)
__cpp_­lib_­concepts 標準ライブラリコンセプト 201806 <concepts> (C++20)
__cpp_­lib_­constexpr_­swap_­algorithms swap および swap 関連関数に対する constexpr 201806 <algorithm> (C++20)
__cpp_lib_enable_shared_from_this shared_from_this の再有効化 201603 <memory> (C++17)
__cpp_lib_exchange_function ユーティリティ関数 exchange() 201304 <utility> (C++14)
__cpp_lib_execution 実行ポリシー 201603 <execution> (C++17)
__cpp_lib_experimental_any クラス any 201411 <experimental/any> (library fundamentals TS)
__cpp_lib_experimental_apply タプルを引数として関数を呼ぶ apply() 201402 <experimental/tuple> (library fundamentals TS)
__cpp_lib_experimental_boyer_moore_searching 追加の検索アルゴリズムを使用するための std::search の拡張 201411 <experimental/functional> (library fundamentals TS)
__cpp_lib_experimental_filesystem ファイルシステム TS 201406 <experimental/filesystem> (filesystem TS)
__cpp_lib_experimental_function_erased_allocator std::function に対する型消去されたアロケータ 201406 <experimental/functional> (library fundamentals TS)
__cpp_lib_experimental_invocation_type 呼び出しの型特性 201406 <experimental/type_traits> (library fundamentals TS)
__cpp_lib_experimental_memory_resources 多相メモリリソース 201402 <experimental/memory_resource> (library fundamentals TS)
__cpp_lib_experimental_optional クラス optional 201411 <experimental/optional> (library fundamentals TS)
__cpp_lib_experimental_packaged_task_erased_allocator std::packaged_task に対する型消去されたアロケータ 201406 <experimental/future> (library fundamentals TS)
__cpp_lib_experimental_parallel_algorithm 並列処理のための拡張 201505 <experimental/algorithm> <experimental/exception_list> <experimental/execution_policy> <experimental/numeric> (parallelism TS)
__cpp_lib_experimental_promise_erased_allocator std::promise に対する型消去されたアロケータ 201406 <experimental/future> (library fundamentals TS)
__cpp_lib_experimental_sample sample 201402 <experimental/algorithm> (library fundamentals TS)
__cpp_lib_experimental_shared_ptr_arrays 配列をサポートするための shared_ptr の拡張 201406 <experimental/memory> (library fundamentals TS)
__cpp_lib_experimental_string_view string_view: 文字列への非所有参照 201411 <experimental/string_view> (library fundamentals TS)
__cpp_lib_experimental_type_trait_variable_templates 型特性に対する変数テンプレート 201402 <experimental/type_traits> (library fundamentals TS)
__cpp_lib_filesystem ファイルシステムライブラリ 201703 <filesystem> (C++17)
__cpp_lib_gcd_lcm std::gcdstd::lcm 201606 <numeric> (C++17)
__cpp_lib_generic_associative_lookup 連想コンテナへの型混合比較検索の追加 201304 <map> <set> (C++14)
__cpp_lib_hardware_interference_size constexpr std::hardware_{constructive, destructive}_interference_size 201703 <new> (C++17)
__cpp_lib_has_unique_object_representations std::has_unique_object_representations 201606 <type_traits> (C++17)
__cpp_lib_hypot std::hypot の3引数オーバーロード 201603 <cmath> (C++17)
__cpp_lib_incomplete_container_elements 標準コンテナに対する最低限の不完全型サポート 201505 <forward_list> <list> <vector> (C++17)
__cpp_lib_integer_sequence コンパイル時整数列 201304 <utility> (C++14)
__cpp_lib_integral_constant_callable std::integral_constant::operator() 201304 <type_traits> (C++14)
__cpp_lib_invoke 関数テンプレート std::invoke 201411 <functional> (C++17)
__cpp_lib_is_aggregate 型特性 std::is_aggregate 201703 <type_traits> (C++17)
__cpp_lib_is_final std::is_final 201402 <type_traits> (C++14)
__cpp_lib_is_invocable std::is_invocablestd::invoke_result 201703 <type_traits> (C++17)
__cpp_lib_is_null_pointer std::is_null_pointer 201309 <type_traits> (C++14)
__cpp_lib_is_swappable [nothrow-]swappable 型特性 201603 <type_traits> (C++17)
__cpp_lib_launder Core Issue 1776: 参照メンバを含むクラスオブジェクトの置換 (std::launder) 201606 <new> (C++17)
__cpp_­lib_­list_­remove_­return_­type std::forward_list および std::list のメンバ remove()remove_if() および unique() の戻り値型を変更 201806 <forward_list> <list> (C++20)
__cpp_lib_logical_traits 論理演算子の型特性 201510 <type_traits> (C++17)
__cpp_lib_make_from_tuple make_from_tuple: 構造に対する適用 201606 <tuple> (C++17)
__cpp_lib_make_reverse_iterator std::make_reverse_iterator 201402 <iterator> (C++14)
__cpp_lib_make_unique std::make_unique 201304 <memory> (C++14)
__cpp_lib_map_try_emplace std::map::try_emplacestd::map::insert_or_assign 201411 <map> (C++17)
__cpp_lib_math_special_functions C++17 のための数学の特殊関数 201603 <cmath> (C++17)
__cpp_lib_memory_resource std::pmr::memory_resource 201603 <memory_resource> (C++17)
__cpp_lib_node_extract map と set のスプライシング (std::map::extractstd::map::mergestd::map::insert(node_type) など) 201606 <map> <set> <unordered_map> <unordered_set> (C++17)
__cpp_lib_nonmember_container_access 非メンバの size() その他 (統一コンテナアクセス) 201411 <iterator> <array> <deque> <forward_list> <list> <map> <regex> <set> <string> <unordered_map> <unordered_set> <vector> (C++17)
__cpp_lib_not_fn std::not_fn 201603 <functional> (C++17)
__cpp_lib_null_iterators ヌル ForwardIterator 201304 <iterator> (C++14)
__cpp_lib_optional std::optional 201606 <optional> (C++17)
__cpp_lib_parallel_algorithm C++17 に対して並列処理 TS を適合させる 201603 <algorithm> <numeric> (C++17)
__cpp_lib_quoted_string_io std::quoted 201304 <iomanip> (C++14)
__cpp_lib_raw_memory_algorithms メモリ管理ツールの拡張 201606 <memory> (C++17)
__cpp_lib_result_of_sfinae std::result_of と SFINAE 201210 <functional> <type_traits> (C++14)
__cpp_lib_robust_nonmodifying_seq_ops 非変更シーケンス操作をより頑健にする (std::mismatchstd::equal および std::is_permutation に対する範囲を2つ取るオーバーロード) 201304 <algorithm> (C++14)
__cpp_lib_sample std::sample 201603 <algorithm> (C++17)
__cpp_lib_scoped_lock 可変長引数を取る std::lock_guard (std::scoped_lock) 201703 <mutex> (C++17)
__cpp_lib_shared_mutex std::shared_mutex (タイムアウト付きでない) 201505 <shared_mutex> (C++17)
__cpp_lib_shared_ptr_arrays std::shared_ptr<T[]> 201611 <memory> (C++17)
__cpp_lib_shared_ptr_weak_type shared_ptr::weak_type 201606 <memory> (C++17)
__cpp_lib_shared_timed_mutex shared_mutexshared_timed_mutex に名前変更 201402 <shared_mutex> (C++14)
__cpp_lib_string_udls 文字列型に対するユーザ定義リテラル 201304 <string> (C++14)
__cpp_lib_string_view std::string_view 201606 <string> <string_view> (C++17)
__cpp_lib_to_chars 初等文字列変換 (std::to_charsstd::from_chars) 201611 <utility> (C++17)
__cpp_lib_transformation_trait_aliases 帰ってきた TransformationTrait 201304 <type_traits> (C++14)
__cpp_lib_transparent_operators 演算子関数オブジェクトを greater<> にする 201210 <functional> (C++14)
std::owner_less をより柔軟にする (std::owner_less<void>) 201510 <memory> <functional> (C++17)
__cpp_lib_tuple_element_t std::tuple_element_t 201402 <tuple> (C++14)
__cpp_lib_tuples_by_type タプルを型でアドレスする 201304 <utility> <tuple> (C++14)
__cpp_lib_type_trait_variable_templates 型特性の変数テンプレート (std::is_void_v など) 201510 <type_traits> (C++17)
__cpp_lib_uncaught_exceptions std::uncaught_exceptions 201411 <exception> (C++17)
__cpp_lib_unordered_map_try_emplace std::unordered_map::try_emplacestd::unordered_map::insert_or_assign 201411 <unordered_map> (C++17)
__cpp_lib_variant std::variant: C++17 のための型安全な union 201606 <variant> (C++17)
__cpp_lib_void_t std::void_t 201411 <type_traits> (C++17)
__cpp_namespace_attributes 名前空間に対する属性 201411 定義済み (C++17)
__cpp_noexcept_function_type 例外指定を型システムの一部とする 201510 定義済み (C++17)
__cpp_nontype_template_args すべての非型テンプレート引数に対して定数評価を可能とする 201411 定義済み (C++17)
__cpp_nontype_template_parameter_auto auto を用いた非型テンプレート引数の宣言 201606 定義済み (C++17)
__cpp_nontype_template_parameter_class 非型テンプレート引数におけるクラス型 201806 定義済み (C++20)
__cpp_nsdmi 非静的データメンバ初期化子 200809 定義済み (C++11)
__cpp_range_based_for 範囲ベースの for ループ 200907 定義済み (C++11)
一般化された範囲ベースの for ループ 201603 定義済み (C++17)
__cpp_raw_strings 生文字列リテラル 200710 定義済み (C++11)
__cpp_ref_qualifiers 参照修飾子 200710 定義済み (C++11)
__cpp_return_type_deduction 普通の関数に対する戻り値型の推定 201304 定義済み (C++14)
__cpp_rtti 実行時型識別 (dynamic_casttypeid) 199711 定義済み (c++98)
__cpp_rvalue_references 右辺値参照 200610 定義済み (C++11)
__cpp_sized_deallocation サイズ付き解放 201309 定義済み (C++14)
__cpp_static_assert static_assert 200410 定義済み (C++11)
拡張された static_assert 201411 定義済み (C++17)
__cpp_structured_bindings 構造化束縛 201606 定義済み (C++17)
__cpp_template_template_args テンプレートテンプレート引数のマッチング 201611 定義済み (C++17)
__cpp_threadsafe_static_init 動的初期化および破棄の並列処理対応 200806 定義済み (C++11)
__cpp_transactional_memory トランザクショナルメモリ 201505 定義済み (TM TS)
__cpp_unicode_characters 新しい文字型 (char16_t および char32_t) 200704 定義済み (C++11)
__cpp_unicode_literals Unicode 文字列リテラル 200710 定義済み (C++11)
__cpp_user_defined_literals ユーザ定義リテラル 200809 定義済み (C++11)
__cpp_variable_templates 変数テンプレート 201304 定義済み (C++14)
__cpp_variadic_templates 可変長引数テンプレート 200704 定義済み (C++11)
__cpp_variadic_using using 宣言におけるパック展開 201611 定義済み (C++17)

[編集]

#ifdef __has_include                           // __has_include が存在するかチェック
#  if __has_include(<optional>)                // 標準ライブラリに対するチェック
#    include <optional>
#  elif __has_include(<experimental/optional>) // 実験的なバージョンに対するチェック
#    include <experimental/optional>
#  elif __has_include(<boost/optional.hpp>)    // 外部のライブラリを試す
#    include <boost/optional.hpp>
#  else                                        // まったく何も見付からなかった
#     error "Missing <optional>"
#  endif
#endif
 
#ifdef __has_cpp_attribute                      // __has_cpp_attribute が存在するかチェック
#  if __has_cpp_attribute(deprecated)           // 属性に対するチェック
#    define DEPRECATED(msg) [[deprecated(msg)]]
#  endif
#endif
#ifndef DEPRECATED
#    define DEPRECATED(msg)
#endif
 
DEPRECATED("foo() has been deprecated") void foo();
 
#if __cpp_constexpr >= 201304                   // 機能の特定のバージョンに対するチェック
#  define CONSTEXPR constexpr
#else
#  define CONSTEXPR inline
#endif
 
CONSTEXPR int bar(unsigned i)
{
#if __cpp_binary_literals                    // 機能の存在に対するチェック
    unsigned mask1 = 0b11000000;
    unsigned mask2 = 0b00000111;
#else
    unsigned mask1 = 0xC0;
    unsigned mask2 = 0x07;
#endif
    if ( i & mask1 )
        return 1;
    if ( i & mask2 )
        return 2;
    return 0;
}
 
int main()
{
}


[編集] 関連項目

Standing Document 6 機能テスト勧告の公式のドキュメント