C++参数可变的函数的传递与储存

    一.
        1)void(*callback)(int count, ...);  //函数指针
        2)void A(void(*callback)(int count, ...), int count, ...);  //传递
        3)利用<stdarg.h>的函数获取参数;
        缺点:没有类型及边界检查,不安全,不建议使用;
                    要传递的函数写法固定为 类型 函数名(int count, ...)。
    二.
        1)template<typename... Args>
           void(*callback)(Args...);  //错误写法
        2)template<typename... Args>
           void A(void(*callback)(Args...), Args... args);
        3)利用模板参数包和函数参数包实现;
        缺点:不能声明模板函数指针(成员)变量,只能在模板函数中作为参数传递,故不能储存一个可变函数。
    三.
        1)void(*callback)(void*a,void*b,void*c);
        2)void A(void(*callback)(void*a,void*b,void*c),
                        void*a=nullptr,void*b=nullptr,void*c=nullptr);
        3)利用void*实现;
        缺点:参数最大数量固定;
                   要传递的函数写法固定为 类型 函数名(void*a,void*b,void*c)。

更新:

可以使用bind()函数,函数对象,泛型编程实现真正的"C++参数可变的函数的传递与储存",如下:

#include <functional>

using Task = std::function<void()>;  //函数对象类型

template<class F,class... Args>
void add_task(F &&f, Args&&... args) {  //万能引用、模板函数参数包
        Task task = std::bind(std::forward<F>(f), std::forward<Args>(args)...);  //完美转发
        //task即为绑定好的函数对象,通过函数对象类型存储调用
        ......
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

❀云坠入雾里

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值