yohhoyの日記

技術的メモをしていきたい日記

Detection Idiom

C++1z(C++17)標準ヘッダ<type_traits>に追加されるstd::void_tクラステンプレートを用いたイディオム。クラスメンバの存在検知や、型に対して特定の式が有効なことを検知できる。

// C++1z: 型Tがメンバtypeを持つか?
template <class, class = std::void_t<>>
struct has_type_member : std::false_type {};

template <class T>
struct has_type_member<T, void_t<typename T::type>>
  : std::true_type {};
// C++1z: 型Tは前置インクリメント演算可能か?
template <class, class = std::void_t<>>
struct has_pre_increment_member : std::false_type {};

template <class T>
struct has_pre_increment_member<T, std::void_t<decltype( ++std::declval<T&>() )>>
  : std::true_type {}; 

N4502では同イディオム実装をサポートするToolkit(クラステンプレート群)のC++標準ライブラリ導入を提案している。

関連URL: