我一直在使用(并且看到使用)static_assert
来标记模板参数值的不需要的值。但是,对于我遇到的所有情况,通过 SFINAE 禁用那些不需要的值似乎更好、更优雅。
例如:
template<typename T,
class = std::enable_if<std::is_floating_point<T>::value>::type>
struct Foo { ... };
代替:
template<typename T>
struct Foo
{
static_assert(std::is_floating_point<T>::value,
"Foo<T>: T must be floating point :-(");
...
};
所以我的问题是:我应该什么时候使用static_assert
而不是 SFINAE,为什么?
编辑:
我认为到目前为止我学到的内容如下:
1. SFINAE 是一种通用且功能强大但可能非常复杂的工具,可用于许多任务,包括函数重载解析(有些人似乎认为这是它的唯一目的)。
2. SFINAE 可以在任何可能的地方以相对简单的方式使用static_assert
,除了它出现在(类或函数的)声明中而不是它的定义中(或者可以在static_assert
类前向声明中插入一个?) . 这使得更逐字,因此更清晰的代码。然而,由于 SFINAE 很复杂,它往往比简单的static_assert
.
3.另一方面static_assert
,编译器错误消息更清晰,有些人似乎认为这是两者的主要目的。