std::enable_if … else он же typename_if_else

#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