以下(建议!)语法是否有任何缺点?
template< typename T >
void f() static_assert(std::is_same< T, int >::value)
{ ; }
Run Code Online (Sandbox Code Playgroud)
而不是SFINAE(看起来像拐杖):
template< typename T, typename = typename std::enable_if< std::is_same< T, int >::value >::type >
void f() { ; }
Run Code Online (Sandbox Code Playgroud)
甚至更糟:
template< typename T >
typename std::enable_if< std::is_same< T, int >::value >::type
f()
{ ; }
Run Code Online (Sandbox Code Playgroud)
禁止使用auto扣除结果类型.
Mat*_* M. 18
首先,这些是不同的,特别是它们不会同时检查.
关键的区别在于它们在过载分辨率方面的应用.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{}) { ... }
Run Code Online (Sandbox Code Playgroud)
...并且您可以完美地使用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))
{ ... }
Run Code Online (Sandbox Code Playgroud)
为什么使用static_assert比Concepts Lite语法更好?
template< typename T >
void f() requires Int<T>()
{ }
Run Code Online (Sandbox Code Playgroud)
要么:
template< Int T >
void f()
{ }
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4957 次 |
| 最近记录: |