如何将 list 的值传给函数的可变参数? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
icemanpro
V2EX    C++

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

  •  
  •   icemanpro 2021-08-30 18:13:52 +08:00 2722 次点击
    这是一个创建于 1558 天前的主题,其中的信息可能已经有所发展或是发生改变。
    第 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  
      &nsp;2021-08-30 20:39:07 +08:00 via Android
    同意二楼,除了汇编,没想出别的办法
    itechify
        7
    itechify  
    PRO
       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     Solana     995 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 28ms UTC 18:53 PVG 02:53 LAX 10:53 JFK 13:53
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86