怎么将可变参数的函数的参数传递给另一个可变参数的函数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了怎么将可变参数的函数的参数传递给另一个可变参数的函数相关的知识,希望对你有一定的参考价值。

无办法直接做到这一点,不过可以采用其他方法实现,例如:首先,定义被调用函数的参数为va_list类型,同时在调用函数中将可变长参数列表转换为va_list,这样就可以进行变长参数的传递了。看如下所示:
void subfunc (char *fmt, va_list argp)

...
arg = va_arg (fmt, argp); /* 从argp中逐一取出所要的参数 */
...

void mainfunc (char *fmt, ...)

va_list argp;
va_start (argp, fmt); /* 将可变长参数转换为va_list */
subfunc (fmt, argp); /* 将va_list传递给子函数 */
va_end (argp);
...

这样就OK了!
参考技术A 我遇到的场景是多个模块的日志函数需要统一到一个接口去是实现,因为除了可变参数部分,还有一些杂七杂八的变量,需要判断处理
func1_log(int lv,const char* module, const char* format,...);
func2_log(int lv, int type, const char* format,...);
func3_log(int lv,const char* format,...);
最终转为
func_comm_log(int lv,const char* format,...);
本来只是想着在上面那些函数里面都调用一下 comm_log() ...进行透传就搞定了,实际运行的时候才发现这个 ...既不能透传,转为 va_list 传入也不再是... 了;
我就在找 ... 传递到func_comm_log 这个函数的方法,始终是没有找到,用宏定义也不行,这个...也没法转成args... 、___VA_ARGS__这些宏定义才能使用的变量;
查资料,测试了一天,吃完晚饭才发现,直接在func_comm_log()上面加一层,把可变参数列表传入到format里面,... 就不要了就完了呗
唉,我还是妥协了,这只是一种妥协的方法哈,如果你有好的方法,请分享给我,我真的很想彻底知道这个 ... 在函数里面究竟是怎么进行透传的。
之前也遇到过这个情况,始终是没找到用法,本来以为今天必解决了呢,GG。。。

将可变参数函数模板参数传递给另一个函数

【中文标题】将可变参数函数模板参数传递给另一个函数【英文标题】:Passing variadic function template arguments to another function 【发布时间】:2014-06-29 01:38:20 【问题描述】:

我正在尝试将我的包传递给另一个函数,它看起来与我在教程中看到的相似,但显然不够相似:

class algorithm
    
        typedef uint64_t time_type;
    protected:
        std::string name;
        time_type result;

        template <typename... Args>
        void execute(const Args&...);

    public:
        algorithm(std::string name);

        //virtual void prepareTest()=0;
        template <typename TimeT, typename... Args>
        void beginTest(const Args&...);
        void printResult();
        time_type getResult();

    ;

    template <typename TimeT, typename... Args>
    void algorithm::beginTest(const Args&... args)
    
        auto start = chrono::high_resolution_clock::now();

        execute(args...);

        auto duration = chrono::duration_cast<TimeT>
                    (chrono::high_resolution_clock::now() - start);

        result = duration.count();
    

    template <typename... Args>
    void execute(const Args&... args)
    
        //nothing here yet
    

当我实例化一个算法和 beginTest() 时,我得到一个链接器错误:

const int n = 100000;
const int m = 1000;
algortest::algorithm brutus("brutus");
brutus.beginTest<chrono::milliseconds>(n, m);

架构 x86_64 的未定义符号:“void algortest::algorithm::execute(int const&, int const&)", 参考自: 无效算法::算法::beginTest >, int, int>(int const&, int const&) in main.o ld:未找到架构 x86_64 的符号

我做错了什么?另外,在派生类算法中覆盖 execute() 是否可行?

【问题讨论】:

不是 100% 确定,如果这特别适用于您的用例(TL;DR;老实说),但这不是 std::forward() 模板函数的设计目的吗? 显然你在成员函数execute的定义中缺少类作用域。 【参考方案1】:

你忘了在execute 的定义前面加上algorithm:: 就是所有:-)

应该是:

template <typename... Args>
void algorithm::execute(const Args&... args)

    // ...

您可能还想对参数使用完美转发,而不是强制它们通过引用传递——而不是const Args&amp;...,在调用函数时使用Args&amp;&amp;...,然后使用std::forward&lt;Args&gt;(args)...

【讨论】:

以上是关于怎么将可变参数的函数的参数传递给另一个可变参数的函数的主要内容,如果未能解决你的问题,请参考以下文章

将引用作为命名参数传递给可变参数函数的问题

可以将可变数量的参数传递给函数吗?

我试图将一个非可变整数参数从一个函数传递给其他定义的函数;我的错误是啥?

如何使用 jquery 将可变参数传递给匿名函数?

C – 将可变数量的参数传递给 main

将可变数量的 bash 命令行参数传递给 MATLAB 函数