gpt4 book ai didi

c++ - 当省略号位于模式的最内层元素时,在可变参数模板中打包扩展

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:15:11 24 4
gpt4 key购买 nike

我在 cppreference.com 上看到了这个例子.我不清楚函数参数的包扩展。

Function parameter list

In a function parameter list, if an ellipsis appears in a parameter declaration (whether it names a function parameter pack (as in, Args ... args) or not) the parameter declaration is the pattern:

template<typename ...Ts> void f(Ts...) {}
f('a', 1); // Ts... expands to void f(char, int)
f(0.1); // Ts... expands to void f(double)

template<typename ...Ts, int... N> void g(Ts (&...)[N]) {}
int n[1];
g<const char, int>("a", n); // Ts (&...)[N] expands to const char (&)[2], int(&)[1]

Note: in this pattern, the ellipsis is the innermost element, not the last element as in all other pack expansions.

最佳答案

works :

template<typename ...Ts, int... N> void g(Ts (&...array)[N]) {}
int n[1];
g<const char, int>("a", n); // Ts (&...)[N] expands to const char (&)[2], int(&)[1]

但显然,如果您跳过名称 array,许多编译器都会出现问题。我不知道这是编译器的怪癖还是标准的怪癖(两者都是合理的:这是一种严重的极端情况语法)。

正如@Xeo 所指出的,处理 C 的声明语法的一种不那么迟钝的方法是绕过这个问题:

template<typename T> using Type = T;
template<typename... Ts, int... N> void g( Type<Ts[N]>&... ) {}

更容易解析,并且(至少某些)编译器不需要变量名。

关于c++ - 当省略号位于模式的最内层元素时,在可变参数模板中打包扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21764115/

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