#c #templates #typetraits #enable-if
#c #шаблоны #признаки типов #включить-если
Вопрос:
Аналогично std::enable_if
, я хотел бы иметь else
информацию о типе (мне это нужно для зависимого вариационного шаблона static_cast
). Я расширил возможную реализацию из стандарта следующим образом:
template<bool B, class T = void, class F = void>
struct typename_if_else
{};
template<class T, class F>
struct typename_if_else<true, T, F>
{
typedef T type;
};
template<class T, class F>
struct typename_if_else<false, T, F>
{
typedef F type;
};
template< bool B, class T = void >
using typename_if_else_t = typename typename_if_else<B,T>::type;
Есть ли способ избавиться от пустой структуры (первое определение), которая больше не нужна?
Комментарии:
1. Вы можете избавиться от всех трех специализаций. Не изобретайте колесо заново en.cppreference.com/w/cpp/types/conditional
Ответ №1:
Вы можете создать частичную специализацию шаблона для false
, и пусть true
будет по умолчанию.
template<bool B, class T = void, class F = void>
struct typename_if_else
{
typedef T type;
};
template<class T, class F>
struct typename_if_else<false, T, F>
{
typedef F type;
};
template< bool B, class T = void >
using typename_if_else_t = typename typename_if_else<B,T>::type;
Комментарии:
1. Это частичная специализация, а не переопределение
Ответ №2:
Есть ли способ избавиться от пустой структуры (первое определение), которая больше не нужна?
Да, благодаря std::conditional
вы можете даже избавиться от частичных специализаций:
#include <type_traits>
template<bool B, class T = void, class F = void>
using typename_if_else = std::conditional_t<B, T, F>; // (can be omitted if you only care for typename_if_else_t)
template<bool B, class T = void>
using typename_if_else_t = typename typename_if_else<B,T>::type;
Комментарии:
1. Почему бы просто не рекомендовать использовать
std::conditional_t
напрямую?2. Я не имел в виду реализацию
typename_if_else
; Я имею в виду, почему не заменить полностьюtypename_if_else
? Это просто добавляет еще один уровень ненужной косвенности к функциональности, которая уже существует в стандартной библиотеке (и даже использует стандартную библиотеку для реализации этой косвенности)3. @dfrib pfff это то, что я получаю за то, что отвечаю на вопрос SO во время разговора по телефону … исправляю спасибо.
4. Это действительно то, что я искал! Должно быть рекомендовано в См. Также
std::enable_if
…