如何将 list 的值传给函数的可变参数?

2021-08-30 18:13:52 +08:00
 icemanpro
2060 次点击
所在节点    C++
11 条回复
zzxxisme
2021-08-30 18:21:44 +08:00
这个问题问得不知道怎么回答,因为描述不清楚,可以有很多种理解,例如是把整个 list 当做一个参数传给函数,还是把 list 的每个元素拿出来传给函数的每个参数?你的 list 和函数的签名是怎样的?最好能给段代码来表明你要做的事情,还有你做过什么样的尝试,这些尝试有什么问题。
xylophone21
2021-08-30 18:22:44 +08:00
依稀记得多年前是用汇编搞定的
encounter2017
2021-08-30 18:38:43 +08:00
christopheredwar
2021-08-30 18:39:25 +08:00
是 Python 麽?*args 接住传进来的 list,然后正常解析
ysc3839
2021-08-30 18:41:41 +08:00
如果你说的是 parameter pack https://en.cppreference.com/w/cpp/language/parameter_pack#Pack_expansion
那应该是不行的,因为这是编译期就确定长度的。

如果你说的是 C 的 variadic arguments https://en.cppreference.com/w/c/language/variadic
那符合 C 标准的方法是没有的,但是有在某些平台或编译器下的方法,比如 gcc 可以用 __builtin_apply https://stackoverflow.com/a/23789807/6911112
iceheart
2021-08-30 20:39:07 +08:00
同意二楼,除了汇编,没想出别的办法
oneisall8955
2021-08-30 20:50:07 +08:00
不了解 c++,JAVA 里面可以用数组传给可变参数
ipwx
2021-08-30 21:16:45 +08:00
我觉得这是个 XY problem 。

楼主你能不能把你的原始需求说一说,C++ 不会这么思考问题的。
zzxxisme
2021-08-30 22:18:28 +08:00
看了其他人的理解,我觉得问题是把一个 list 的所有元素传到一个函数的参数列表,而函数的参数列表是 C 的可变参数。我想的是,既然是传给函数作为参数,list 的长度(也就是参数的数目)应该假设不会很多,于是可以假设一个最大 list 长度。如果是利用 C++,可以写一个模板函数,通过递归的方法一下下把每个元素取出来并用 parameter pack 存着,把所有都拿到之后,然后传给带可变参数的函数。像 5 楼说的,用 parameter pack 要在编译期间确定长度,这个长度就是前面说的最大 list 长度。

然后试着写了一下: https://gist.github.com/zzxx-husky/40a42457c01b86f388974a14278dc78e
imKiva
2021-08-31 16:53:08 +08:00
这个问题感觉最方便的办法是用 libffi,之前遇到同样问题的时候想了很久,因为需要支持多种 arch,所以最后选择了 libffi
liuidetmks
2021-09-01 06:37:56 +08:00
我来个粗暴的,封装一个函数,接受数组参数。
在里面根据数组个数,再来手动调用 原函数。
switch 30 个 case,应该够了吧
你的函数总不至于有几百上千个参数一次传入吧

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/798901

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX