Могу ли я использовать enable_if вместе с typedef?

Я хочу определить переменную, для которой тип зависит от некоторого условия. Я хочу что-то вроде этого:

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

Но составитель говорит, что я переопределил тип.

Как я могу это сделать?

6

Решение

Могу ли я использовать enable_if вместе с typedef?

Нет, ты не можешь. std::enable_if оставляет тип неопределенным, если условие ложно. Только если условие верно, член type определено;

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

Если B является true, std::enable_if имеет открытый тип typedef члена, равный T; в противном случае, нет члена typedef.

Чтобы typedef работал правильно, ему нужен тип для обоих случаев, когда условие истинно и когда ложно. enable_if реализуется, чтобы помочь в сценариях, связанных с SFINAE.

Итак, тогда

Как я могу это сделать?

использование std::conditional. Условный будет содержать член typedef (type) для обоих true а также false результат условия.

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

Предоставляет тип typedef члена, который определяется как T если B является true во время компиляции или как F если B является false,

Следовательно, следующего будет достаточно;

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

Или более кратко;

using Type = std::conditional_t<cond, int, double>;
10

Другие решения

Вам нужно использовать 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>;
7

По вопросам рекламы [email protected]