关于可变参数函数调用

本文编写 visualfc

    写一个invoke函数以支持任意参数调用,实现类似以下的功能代码。注:本代码纯属试验。
  1. class a
  2. {
  3.    void func1(int,int);
  4.    void func2(char*,int);
  5. };

  6. void invoke(a*,char * method,...);

  7. void test()
  8. {
  9.    a a1,
  10.    invoke(&a1,"func1",10,20);
  11.    invoke(&a2,"func2","ok",0);
  12. }
    我目前试验了三种方式,第一种是模板方式实现,第二种是基于可变参数(...)实现,第三种是使用类似boost::any的方式来实现。比较三种方式, 模板方式实现起来尤其不易,但是能够做参数检查,问题在于只能存在在头文件中。 第二种为可变参数方式, 本文给出了这种方式的试验代码,实现起来也比较简单,问题是无法验证参数。第三种方式为以类似any的方式来实现,但是实现效率则相对较低。
    下面给出了第二种方式,即使用可变参数调用的实现,没有使用va_list和va_arg,这是因为函数调用栈顺序的原因,我使用了自定义的get_arg_back函数来获取可变参数。

  1. template <typename T>
  2. T get_arg_back(char ** parg)
  3. {
  4.     *parg -= sizeof(T);
  5.     T t = *((T*)*parg);
  6.     return t;
  7. }
  8. template <typename R, typename CLS, typename T1, typename T2>
  9. R invoke_cls(CLS * pcls, R (CLS::*ptr)(T1,T2), char ** parg)
  10. {
  11.     char * end = *parg+sizeof(T1)+sizeof(T2);
  12.     return (pcls->*ptr)(get_arg_back<T1>(&end),get_arg_back<T2>(&end));
  13. }

  14. class a
  15. {
  16. public:
  17.     int test(char * buf, int i)
  18.     {
  19.         printf ("test %s %d/n",buf,i);
  20.         return 0;
  21.     }
  22.     int test2(int i, char * buf)
  23.     {
  24.         printf ("test2 %s %d/n",buf,i);
  25.         return 100;
  26.     }
  27. };
  28. void invoke(void * ptr, char * method,...)
  29. {
  30.     char * parg = (char*)&method+sizeof(method);
  31.     if (method == "test")
  32.         invoke_cls((a*)ptr,&a::test,&parg);
  33.     else if (method == "test2")
  34.         invoke_cls((a*)ptr,&a::test2,&parg);
  35.     parg = NULL;
  36. }
  37. int main(int argc, char* argv[])
  38. {
  39.     a a1;
  40.     invoke(&a1,"test","ok",1);
  41.     invoke(&a1,"test2",1,"ok");
  42.     return 0;
  43. }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值