【发布时间】:2016-10-16 22:17:25
【问题描述】:
不止一次(甚至在 SO)我见过这样的代码:
template<typename U, typename... G, typename T = Traits<U>>
struct {
static_assert(sizeof...(G) == 0, "!");
// ...
};
或者这个:
template<typename T, typename... G, typename = std::enable_if_t<condition<T>>
void func(T &&t) {
static_assert(sizeof...(G) == 0, "!");
// ....
}
目的是避免用户通过执行以下操作来破坏游戏规则:
template<typename T, typename = std::enable_if_t<std::is_same<T, int>>
void func(T &&t) {
// ....
}
// ...
func<int&, void>(my_int);
使用保护参数包,不能覆盖默认值。
另一方面,对大小的检查避免了无用参数对专业的污染。
无论如何,因为[temp.res/8],我们有这个:
程序格式错误,不需要诊断,如果:
[...]
- 可变参数模板的每个有效特化都需要一个空模板参数包,或者
[...]
因此,包含上述 sn-ps 的程序是否格式错误?
【问题讨论】:
-
是的。这就是为什么有经验的 TMP'lers 会使用一个类模板,该模板同时采用包的大小和
T来确定@987654326@ 条件。 (虽然我不知道有经验的 TMP'lers 是否真的会首先采用这种方法。) -
一开始我看不到使用参数包的意义,您可以使用
template <typename T, std::enable_if_t<condition<T>, int> = 0>,用户无法绕过,也可以在开关SFINAE中使用. -
@Corristo,从来没有这样的代码。好技巧!
-
@Corristo 我怀疑你没有明白问题的重点。这与如何编写 sfinae 表达式无关。
-
@skypack 是的,我知道,但我想强调的是,
<typename T, std::enable_if_t<condition<T>, int> = 0>模板在各方面都优于参数包。
标签: c++ templates language-lawyer variadic-templates