SFINAE: static_assert vs std :: enable_if

Есть ли недостатки в следующем (предложил!Синтаксис?

template< typename T >
void f() static_assert(std::is_same< T, int >::value)
{ ; }

вместо SFINAE (это похоже на костыль):

template< typename T, typename = typename std::enable_if< std::is_same< T, int >::value >::type >
void f() { ; }

или еще хуже:

template< typename T >
typename std::enable_if< std::is_same< T, int >::value >::type
f()
{ ; }

который запрещает использование auto удержание типа результата.

14

Решение

Зачем бы использовать static_assert быть лучше чем Понятия Lite синтаксис?

template< typename T >
void f() requires Int<T>()
{ }

или же:

template< Int T >
void f()
{ }
7

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

Прежде всего, они разные, конкретно они не проверяются одновременно.

Критическое различие связано с их применением в отношении разрешения перегрузки. SFINAE будет отбирать функции из набора перегрузки, так что будет выбрана другая функция (если есть), тогда как static_assert применены после разрешение перегрузки и, следовательно, даст ошибка это остановит компиляцию.

Теперь, что касается вашей жалобы, вы можете прекрасно использовать auto и СФИНАЕ:

// Ensure that T is int
template <typename T>
auto f() -> typename std::enable_if< std::is_same< T, int >::value >::type
{ ... }

// Only pick this overload if begin(c) and end(c) are available
template <typename T>
auto f(T const& c) -> decltype(begin(c), end(c), bool{}) { ... }

… и вы можете прекрасно использовать SFINAE и автоматическое удержание типа

template <typename T,
typename = typename std::enable_if<std::is_same<T, int>::value>::type>
auto f() { ... }

template <typename T>
auto f(void* =
typename std::enable_if<std::is_same<T, int>::value>::type*(0))
{ ... }
17

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector