型が条件に依存する変数を定義したい。私はこのようなものが欲しい:
typedef typename enable_if<cond, int>::type Type;
typedef typename enable_if<!cond, double>::type Type;
しかし、コンパイラは、型を再定義したと言います。
これどうやってするの?
enable_if
typedefと併用できますか?
いいえ、できません。std::enable_if
条件が false の場合、型は未定義のままになります。条件が true の場合にのみ、メンバーtype
が定義されます。
template< bool B, class T = void > struct enable_if;
B
がの場合true
、std::enable_if
パブリック メンバーの typedef 型があり、 に等しいT
。それ以外の場合、メンバ typedef はありません。
typedef が正しく機能するには、条件が true の場合と false の場合の両方の場合の型が必要です。enable_if
SFINAE に関連するシナリオを支援するために実装されています。
それで
これどうやってするの?
を使用しstd::conditional
ます。Conditional には、条件のと結果のtype
両方のメンバー typedef ( ) が含まれます。true
false
template< bool B, class T, class F > struct conditional;
コンパイル時に であるかのように定義
T
されるメンバtypedef 型を提供します。B
true
F
B
false
したがって、以下で十分です。
typedef typename std::conditional<cond, int, double>::type Type;
またはもっと簡潔です。
using Type = std::conditional_t<cond, int, double>;
使用する必要がありますstd::conditional
:
#include <type_traits>
// c++11:
typedef typename std::conditional<cond, int, double>::type Type;
// c++14:
typedef std::conditional_t<cond, int, double> Type;
また、c++11 以降では、型とテンプレートのエイリアスにキーワードを使用できることに注意してくださいusing
(私の意見では少しすっきりしています)。
// c++11
using Type = typename std::conditional<cond, int, double>::type;
// c++14
using Type = std::conditional_t<cond, int, double>;