是否存在以下缺点(建议!) 句法?
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
被申请;被应用after重载解析,因此将给出error这将停止编译。
现在,关于您的投诉,您可以完美使用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))
{ ... }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)