sky*_*ack 7 c++ templates language-lawyer variadic-templates
不止一次(甚至在SO上)我见过这样的代码:
template<typename U, typename... G, typename T = Traits<U>>
struct {
static_assert(sizeof...(G) == 0, "!");
// ...
};
Run Code Online (Sandbox Code Playgroud)
或这个:
template<typename T, typename... G, typename = std::enable_if_t<condition<T>>
void func(T &&t) {
static_assert(sizeof...(G) == 0, "!");
// ....
}
Run Code Online (Sandbox Code Playgroud)
目的是避免用户做这样的事情来打破游戏规则:
template<typename T, typename = std::enable_if_t<std::is_same<T, int>>
void func(T &&t) {
// ....
}
// ...
func<int&, void>(my_int);
Run Code Online (Sandbox Code Playgroud)
使用guard参数包时,无法覆盖默认值.
另一方面,对尺寸的检查避免了无用参数的专业化污染.
无论如何,由于[temp.res/8],我们有:
该程序格式错误,无需诊断,如果:
[...]
- 可变参数模板的每个有效专业化都需要一个空模板参数包,或
[...]
因此,包含上述片段的程序是否格式错误?
| 归档时间: |
|
| 查看次数: |
124 次 |
| 最近记录: |