- type_traits[meta header]
- std[meta namespace]
- class template[meta id-type]
- cpp11[meta cpp]
namespace std {
template <bool B, class T, class F>
struct conditional {
using type = …;
};
template <bool B, class T, class F>
using conditional_t = typename conditional<B,T,F>::type; // C++14
}
コンパイル時条件式。
条件式がtrue
かfalse
かによって、使用する型を切り替える。
conditional
は、条件式B
がtrue
であれば型T
を、そうでなければ型F
を、メンバ型type
として定義する。
- この機能が標準ライブラリに導入される前、Boost C++ Librariesでは、
boost::mpl::if_c
やboost::mpl::if_
という機能が使われていた。if_c
が現在のconditional
であり、bool
定数 (constantのc) を条件式としてとり、使用する型を分岐する。if_
はstatic const bool value
をメンバとして持つ型をパラメータとしてとる高階メタ関数であり、標準ライブラリに直接採用されてはいない conditional
やboost::mpl::if_c
を使う以外に、テンプレートの特殊化を使用する方法もあり、conditional
やboost::mpl::if_c
はその手法を一般化したものである。template <bool> struct Conditional; template <> struct Conditional<true> { using type = int; }; template <> struct Conditional<false> { using type = char; };
#include <type_traits>
static_assert(std::is_same<std::conditional<true, int, char>::type, int>::value, "select int");
static_assert(std::is_same<std::conditional<false, int, char>::type, char>::value, "select char");
int main() {}
- std::conditional[color ff0000]
- C++11
- Clang: 3.0 [mark verified]
- GCC: 4.3.6 [mark verified]
- Visual C++: 2010 [mark verified], 2012 [mark verified], 2013 [mark verified], 2015 [mark verified]
conditional_t
は、2013から。