Я хочу определить переменную, для которой тип зависит от некоторого условия. Я хочу что-то вроде этого:
typedef typename enable_if<cond, int>::type Type;
typedef typename enable_if<!cond, double>::type Type;
Но составитель говорит, что я переопределил тип.
Как я могу это сделать?
Могу ли я использовать
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>;
Вам нужно использовать 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>;