9

型が条件に依存する変数を定義したい。私はこのようなものが欲しい:

typedef typename enable_if<cond, int>::type Type;
typedef typename enable_if<!cond, double>::type Type;

しかし、コンパイラは、型を再定義したと言います。

これどうやってするの?

4

2 に答える 2

13

enable_iftypedefと併用できますか?

いいえ、できません。std::enable_if条件が false の場合、型は未定義のままになります。条件が true の場合にのみ、メンバーtypeが定義されます。

template< bool B, class T = void >
 struct enable_if;

Bがの場合truestd::enable_ifパブリック メンバーの typedef 型があり、 に等しいT。それ以外の場合、メンバ typedef はありません。

typedef が正しく機能するには、条件が true の場合と false の場合の両方の場合の型が必要です。enable_ifSFINAE に関連するシナリオを支援するために実装されています。

それで

これどうやってするの?

を使用しstd::conditionalます。Conditional には、条件のと結果のtype両方のメンバー typedef ( ) が含まれます。truefalse

template< bool B, class T, class F >
 struct conditional;

コンパイル時に であるかのように定義Tされるメンバtypedef 型を提供します。BtrueFBfalse

したがって、以下で十分です。

typedef typename std::conditional<cond, int, double>::type Type;

またはもっと簡潔です。

using Type = std::conditional_t<cond, int, double>;
于 2016-07-18T07:32:31.173 に答える
8

使用する必要があります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>;
于 2016-07-18T07:22:16.547 に答える