我可以将enable_if与typedef一起使用吗?

时间:2016-07-18 07:05:39

标签: c++ templates typedef enable-if redefine

我想定义一个类型取决于某些条件的变量。我想要这样的东西:

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

但是conpiler说我重新定义了这种类型。

我该怎么做?

2 个答案:

答案 0 :(得分:11)

  

我可以将enable_if与typedef一起使用吗?

不,你不能。如果条件为false,则std::enable_if将类型保留为undefined。仅当条件为真时,才定义成员type;

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

如果Btrue,则std::enable_if具有公共成员typedef类型,等于T;否则,没有成员typedef。

要使typedef正常工作,当条件为true且为false时,它需要两种情况的类型。实施enable_if是为了协助与SFINAE相关的情景。

那么

  

我该怎么做?

使用std::conditional。条件将包含条件的typetrue结果的成员typedef(false)。

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

提供成员typedef类型,如果编译时TB,则定义为true,如果F为{{1},则定义为B }}

因此,以下就足够了;

false

或更简洁;

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

答案 1 :(得分:8)

您需要使用Text under shapes

#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开始,您可以使用std::conditional关键字来表示类型和模板别名(在我看来有点清晰):

// c++11
using Type = typename std::conditional<cond, int, double>::type;

// c++14
using Type = std::conditional_t<cond, int, double>;