繁体   English   中英

SFINAE:static_assert vs std :: enable_if

[英]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扣除结果类型。

首先,这些是不同的,具体而言,它们不会同时进行检查。

关键的区别在于它们在过载分辨率方面的应用。 SFINAE将从重载集中剔除函数,以便选择另一个函数(如果有的话),而重载解析应用static_assert ,从而产生将停止编译的错误

现在,关于您的投诉,您可以完美地使用auto和SFINAE:

// 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))
{ ... }

为什么使用static_assertConcepts Lite语法更好?

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

要么:

template< Int T >
  void f()
  { }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM