gpt4 book ai didi

c++ - 创建可折叠模板参数包

转载 作者:太空狗 更新时间:2023-10-29 23:48:44 26 4
gpt4 key购买 nike

问题

是否可以创建可折叠的 (※ 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;
}

是否可以创建可折叠的模板参数包以避免多次编写相同的代码片段( 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 包和别名单个 LR 来解决这个问题。但由于某些原因,以下代码在 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
}

另外,我是否在上面的代码中遗漏了一些让 SFINAE 正常工作的东西(过滤函数只有 int, int (decayed) arguments)?

最佳答案

Is it possible to create template parameter pack that can be folded to avoid writing same fragment of code multiple times?

到位了吗?不在 C++17 中。你必须将你的类型包装成某种 template <typename...> struct typelist;然后在其他地方打开它们。这需要一层间接。

没有办法写类似std::pack的东西据我所知。


I've tried to solve the problem using T pack and aliasing single L and R. [...]

在您的代码中,T...永远是空的,因为它没有被任何东西推导出来。 LR的默认模板参数值将被忽略,因为它们是由函数调用推导出来的。

你需要这样的东西:

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;
}

关于c++ - 创建可折叠模板参数包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53857527/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com