c++ - 创建可折叠模板参数包
问题描述
问题
例子
考虑下面的例子(接受两个类型参数的函数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;
}
是否可以创建可以折叠的模板参数包以避免多次编写相同的代码片段(即 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
pack 和 aliasing single L
and来解决这个问题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
仅具有(衰减)参数的过滤函数)?
解决方案
是否可以创建可以折叠的模板参数包以避免多次编写相同的代码片段?
到位?不在 C++17 中。您必须将您的类型包装成某种类型,template <typename...> struct typelist;
然后在其他地方解开它们。这需要一层间接。
std::pack
据我所知,没有办法写出类似的东西。
我尝试使用 T 包和别名单个 L 和 R 来解决问题。 [...]
在您的代码中,T...
它将始终为空,因为它没有被任何东西推断出来。L
和R
的默认模板参数值被忽略,因为它们是由函数调用推导出来的。
你需要类似的东西:
template<
typename... T,
typename = std::enable_if_t<(... && std::is_same_v<int, T>)>
>
int F(T...){
return 0x70D0;
}
在 C++20 中,您应该能够使用 lambda,如下所示:
template<
typename L,
typename R,
typename = std::enable_if_t<[]<typename... Ts>(){
return (... && std::is_same_v<int, Ts>)
}.operator()<L, R>()>
>
int F(L Left, R Right){
return 0x70D0;
}
推荐阅读
- python - 如何在pyspark中进行平均(目标)编码
- laravel - 如何在 Laravel Mix 中添加 Tailwind
- python - How to split output with \n properly in python?
- javascript - ESLint error: 'value' is never reassigned use 'const' instead
- c++ - C++ 模板;作为模板参数传递的函数的自动推导返回类型;
- groovy - 比较 Jenkins 管道中的日期
- android - 具有 SwipeRefreshLayout 的 viewpager 片段在一段时间后显示空白页面
- docusignapi - 当我要发送请求以查看我的 API 交易时。审核未通过。遵守[[linkstart]]API规则和限制[[linkEnd]]
- neural-network - pytorch线性方法中的多维输入?
- javascript - 为什么自定义事件不需要与 xxx.target.value 一起使用”