省略号和可变参数模板
来源:互联网 发布:sql server版本 编辑:程序博客网 时间:2024/06/04 00:59
1.基本概念
省略号在C/C++中有很多用途,包括函数的变量参数列表。C运行库的printf()就是常见示例。
可变参数模板提供了类型安全和灵活性,可应用于类模板和函数模板。
2.语法示例
template<typename... Arguments> class classname; //省略好在typename后template<typename ...Arguments> class classname; //省略号在Arguments前template<typename ... Arguments> class classname; //省略号在中间
以上格式都可以。可变参数模板可以有0个或多个参数,如果要求至少一个参数:
template<typename one,typename... rest> class classname;
可变参数模板函数示例:
template<typename... Args> returnType fun(Args... args); //参数按值传递templata<typename... Args> returnType fun(Args&... args); //参数引用传递templata<typename... Args> returnType fun(Args*... args); //参数为指针类型templata<typename... Args> returnType fun(const Args&... args); //常量引用templata<typename one,typename... Args> returnType fun(const one& arg1,const Args&... args); //需要至少一个参数
3. C中的省略号
在C中使用省略号显得比较麻烦,示例如下:
#include <stdio.h>#include <stdarg.h>void test(int a,...); int main(){test(1, 2, 3, 4);return 0;}void test(int a,...){va_list args;int nArg = a; //a作为固定参数,用来确定变参的起始地址va_start(args, a);printf("%d\n", va_arg(args,int));printf("%d\n", va_arg(args, int));printf("%d\n", va_arg(args, int));va_end(args);}
其中test函数是个简单的示例,在C中使用省略号必须要有一个指定参数(第一位参数),不能只有省略号。由于函数的参数入栈是从右往左入的,栈的生长是从高地址向低地址生长,所以在参数最左(第一位参数)指定参数就方便确定可变参数的地址了 ,不然没法取得可变参数。
接下来va_list是指向参数的指针,在vadefs.h中定义如下:
typedef char * va_list;
然后看一下va_start的定义:
#define _crt_va_start(ap,v) ( ap = (va_list)_ADDRESSOF(v) + _INTSIZEOF(v) )
从该定义中可以看出来args指向了第二个参数2
然后下一句是执行了va_arg(args,int),然后打印
看一下它的定义
#define _crt_va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )
这句话是将args指向了下一个参数,但是输出的是下一个参数的上一个:( -_INTSIZEOF(t)),这样可以从第二个参数开始,因为va_start已经将args指向了第二个参数,如果不( -_INTSIZEOF(t))的话会跳过第二个,因为args是持续累加的,所以下面的va_arg(args,int)会连续指向第三个参数、第四个......
然后最后的va_end(args)是释放args的指向
#define _crt_va_end(ap) ( ap = (va_list)0 )
但是使用va_arg的话会一直指向下一个,由于不知道参数的个数,早晚会内存溢出,这个问题还不太懂,留坑。。。
0 0
- 省略号和可变参数模板
- 省略号和可变参数模板
- 省略号和可变参数模板
- 省略号和可变参数模板
- 可变模板参数 和 元组
- C/C++可变参数省略号"..."的应用
- C++可变参数模板
- 可变参数模板用法
- 可变参数模板
- 可变模板参数
- 模板中的参数可变
- 可变参数变量模板
- c++可变参数模板
- C++可变参数模板
- C++ 可变参数模板
- 可变参数模板
- 可变模板参数“...”
- C语言函数参数中的省略号(可变参数)
- PHP面向对象:克隆对象2
- leetcode
- WebSocket 浅析
- Linux命令学习总结:cd命令
- cocos2d
- 省略号和可变参数模板
- 一个通用的makefile写法,自动推导文件的依赖关系
- 海量数据解题思路
- leetcode
- OpenVPN 源码编译 在 Linux 平台,Android IOS 源码编译
- $(SRC_COMM:.cpp=.o)
- 这8种武器点亮程序员的个人品牌
- leetcode
- css jquery 实现图片轮换带效果,点击图片可跳网页