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

Can I use enable_if together with typedef?

本文关键字:一起 typedef enable if 我可以      更新时间:2023-10-16

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

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

但是堆积者说我重新定义了类型。

我该怎么做?

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

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

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

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

要使 typedef 正常工作,当条件为真和为假时,它都需要两种情况的类型。 实施enable_if是为了协助与 SFINAE 相关的方案。

那么

那么

我该怎么做?

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

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

提供成员 typedef 类型,如果在编译时true B则定义为T,如果B false则定义为F

因此,以下就足够了;

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>;