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_assert
比Concepts Lite语法更好?
template< typename T >
void f() requires Int<T>()
{ }
或:
template< Int T >
void f()
{ }
相关文章:
- 我的简单if-else语句是如何无法访问的代码
- 如何将enable-if与模板参数和参数包一起使用
- 无论条件是否为true,if总是在c++中执行
- Arduino:for/while/if在void setup()或void loop()之前?——错误:之前需要不合格
- Insert函数不适用于2 if语句C++
- If语句未被求值C++
- C++嵌套if语句,基本货币交换
- 多个If语句与使用逻辑运算符计算条件的单个语句的比较
- 是否可以使用if constexpr删除控制流语句
- 要与"if constexpr"一起使用的编译时消息(在预处理器之后)
- 如何删除peer if else分支中的冗长句子
- 我似乎对if/else的基本语句有问题:/
- if数组上的随机数
- 将按位if条件转换为普通if条件
- If语句在c++中被忽略
- 比较if语句中的数组值和int值
- 使用if-else将数字转换为单词
- 为什么简单的算术减法在"if"条件下不起作用?
- 检查一个类型是否直接派生自"enable if"上下文中的另一个类型(是其子类型)
- SFINAE with boost enable if