9

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

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

但是编译器说我重新定义了类型。

我怎样才能做到这一点?

4

2 回答 2

13

我可以enable_if和 typedef 一起使用吗?

不,你不能。std::enable_if如果条件为假,则类型未定义。仅当条件为真时,才type定义成员;

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

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

为了使 typedef 正常工作,它需要一个类型用于两种情况,条件为真和条件为假。enable_if实施以协助与 SFINAE 相关的场景。

那么那么

我怎样才能做到这一点?

使用std::conditional. Conditional 将包含一个成员 typedef ( type) 用于条件的truefalse结果。

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

提供成员 typedef 类型,在编译时定义为Tif Bis ,或者定义为if is 。trueFBfalse

因此,以下就足够了;

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 回答