关于可变参数函数调用
来源:互联网 发布:人工智能股票有哪些股 编辑:程序博客网 时间:2024/05/17 06:33
本文编写 visualfc
写一个invoke函数以支持任意参数调用,实现类似以下的功能代码。注:本代码纯属试验。
- class a
- {
- void func1(int,int);
- void func2(char*,int);
- };
- void invoke(a*,char * method,...);
- void test()
- {
- a a1,
- invoke(&a1,"func1",10,20);
- invoke(&a2,"func2","ok",0);
- }
下面给出了第二种方式,即使用可变参数调用的实现,没有使用va_list和va_arg,这是因为函数调用栈顺序的原因,我使用了自定义的get_arg_back函数来获取可变参数。
- template <typename T>
- T get_arg_back(char ** parg)
- {
- *parg -= sizeof(T);
- T t = *((T*)*parg);
- return t;
- }
- template <typename R, typename CLS, typename T1, typename T2>
- R invoke_cls(CLS * pcls, R (CLS::*ptr)(T1,T2), char ** parg)
- {
- char * end = *parg+sizeof(T1)+sizeof(T2);
- return (pcls->*ptr)(get_arg_back<T1>(&end),get_arg_back<T2>(&end));
- }
- class a
- {
- public:
- int test(char * buf, int i)
- {
- printf ("test %s %d/n",buf,i);
- return 0;
- }
- int test2(int i, char * buf)
- {
- printf ("test2 %s %d/n",buf,i);
- return 100;
- }
- };
- void invoke(void * ptr, char * method,...)
- {
- char * parg = (char*)&method+sizeof(method);
- if (method == "test")
- invoke_cls((a*)ptr,&a::test,&parg);
- else if (method == "test2")
- invoke_cls((a*)ptr,&a::test2,&parg);
- parg = NULL;
- }
- int main(int argc, char* argv[])
- {
- a a1;
- invoke(&a1,"test","ok",1);
- invoke(&a1,"test2",1,"ok");
- return 0;
- }
- 关于可变参数函数调用
- Golang可变参数函数调用
- 关于可变参数的函数
- 关于函数的可变参数
- 关于可变参数的函数
- C#关于静态函数与普通函数之间的调用问题,以及可变参数的使用
- 动态的调用可变参数函数
- 动态的调用可变参数函数
- 动态的调用可变参数函数
- python可变参数调用函数问题
- Scala 可变参数函数的灵活调用
- 关于可变参数函数的若干问题(转载)
- 关于iphone可变参数函数的定义
- 关于C++编写可变参数的函数
- 如何在一个可变参数函数中调用另一个可变参数函数
- 关于python函数的可变参数和关键词参数
- 可变参数列表的函数调用 va_list va_start va_arg va_end
- 关于可变参数-转
- 开张第一篇:porting linux2.6.16 to sep4020微处理器(东南大学自主设计的arm720T处理器)
- javascript:document对象的常用属性和方法
- jMock之Expections
- 也谈Javascript的效率,createElement和innerHTML,为innerHTML平反
- 基于linux2.6.16的nand驱动开发(一)
- 关于可变参数函数调用
- S-232接口定义及连线
- vs2008打开aspx文件时设计界面死机情况的解决
- 翻译生涯
- 基于linux2.6.16的nand驱动开发(二)
- C++垃圾收集--智能指针
- 人生低谷
- 基于linux2.6.16的nand驱动开发(三)
- C++运算符优先级