【发布时间】:2018-12-19 18:52:28
【问题描述】:
问题
是否可以创建可折叠(※fold expression)模板parameter pack?
示例
考虑以下示例(函数接受两个 int (decayed) 类型的参数)。
template<
typename L,
typename R,
typename = std::enable_if_t<
std::is_same_v<int, std::decay_t<L>>
&& std::is_same_v<int, std::decay_t<R>>
>
>
int F(L Left, R Right){
return 0x70D0;
}
是否可以创建可以折叠的模板参数包以避免多次编写相同的代码片段(ie std::is_same_v)?
下面用std::pack 表示的东西可以简化使用SFINAE 吗?
typename = std::enable_if_t<(... && std::is_same_v<int, std::decay_t<std::pack<L, R>>>)>
我尝试过的
我尝试使用T 包和别名单个L 和R 来解决问题。
但是对于某些原因,以下代码在 MSVC 15.9.4+28307.222 上编译并运行没有错误(第二个 F 函数调用的第二个参数,已衰减,不等于 int):
template<
typename... T,
typename L = std::tuple_element_t<0, std::tuple<T...>>,
typename R = std::tuple_element_t<1, std::tuple<T...>>,
typename = std::enable_if_t<(... && std::is_same_v<int, std::decay_t<T>>)>
>
int F(L Left, R Right){
return 0x70D0;
}
int main(){
F(3, 5); // OK
F(3, "5"); // OK, but should not compile
}
PS 另外,我是否遗漏了上述代码中的某些内容以使 SFINAE 正常工作(仅使用 int, int(衰减)参数的过滤函数)?
【问题讨论】:
-
我投票决定将此问题作为题外话结束,因为显然 OP 不再想要它了?
-
@Hans,这不是 SO 的工作方式。如果问题是关于主题的,那么它属于 SO 社区。我们不会删除这样的好内容。
-
@TobySpeight 我不确定是回滚 OP 对问题的删除还是 VTC - 我下次会回滚
标签: c++ c++17 variadic-templates template-meta-programming sfinae