V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
icemanpro
V2EX  ›  C++

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

  •  
  •   icemanpro · 2021-08-30 18:13:52 +08:00 · 2026 次点击
    这是一个创建于 942 天前的主题,其中的信息可能已经有所发展或是发生改变。
    第 1 条附言  ·  2021-08-31 09:15:17 +08:00
    是 @zzxxisme 这样的理解。
    11 条回复    2021-09-01 06:37:56 +08:00
    zzxxisme
        1
    zzxxisme  
       2021-08-30 18:21:44 +08:00 via Android
    这个问题问得不知道怎么回答,因为描述不清楚,可以有很多种理解,例如是把整个 list 当做一个参数传给函数,还是把 list 的每个元素拿出来传给函数的每个参数?你的 list 和函数的签名是怎样的?最好能给段代码来表明你要做的事情,还有你做过什么样的尝试,这些尝试有什么问题。
    xylophone21
        2
    xylophone21  
       2021-08-30 18:22:44 +08:00
    依稀记得多年前是用汇编搞定的
    christopheredwar
        4
    christopheredwar  
       2021-08-30 18:39:25 +08:00
    是 Python 麽?*args 接住传进来的 list,然后正常解析
    ysc3839
        5
    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
        6
    iceheart  
       2021-08-30 20:39:07 +08:00 via Android
    同意二楼,除了汇编,没想出别的办法
    oneisall8955
        7
    oneisall8955  
       2021-08-30 20:50:07 +08:00 via Android
    不了解 c++,JAVA 里面可以用数组传给可变参数
    ipwx
        8
    ipwx  
       2021-08-30 21:16:45 +08:00
    我觉得这是个 XY problem 。

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

    然后试着写了一下: https://gist.github.com/zzxx-husky/40a42457c01b86f388974a14278dc78e
    imKiva
        10
    imKiva  
       2021-08-31 16:53:08 +08:00 via iPhone
    这个问题感觉最方便的办法是用 libffi,之前遇到同样问题的时候想了很久,因为需要支持多种 arch,所以最后选择了 libffi
    liuidetmks
        11
    liuidetmks  
       2021-09-01 06:37:56 +08:00 via iPhone
    我来个粗暴的,封装一个函数,接受数组参数。
    在里面根据数组个数,再来手动调用 原函数。
    switch 30 个 case,应该够了吧
    你的函数总不至于有几百上千个参数一次传入吧
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2859 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 12:58 · PVG 20:58 · LAX 05:58 · JFK 08:58
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.