c++可变模板参数
在C++中的可变模板参数使用省略号 ... 来表示一个参数包(Parameter Pack),其具体位置决定了这个包是模板参数包还是函数参数包,以及如何进行参数展开。
1. 模板参数包:c... Args
省略号放在类型名称的右边,用来表示模板参数包,即可以接受任意数量的模板类型参数。
template<typename... Args> // 模板参数包
class MyClass {
// 这里 Args 是一个参数包,可以包含多个类型
};
在上面的例子中,typename... 是一个模板参数包,可以接受任意数量的类型参数。
Args 本身是一个类型的集合(例如 int, double, std::string 等等)。
2. 函数参数包:Args... args
省略号放在参数名称的右边,用来表示函数参数包,即可以接受任意数量的函数实参。
template<typename... Args>
void myFunction(Args... args) {
// 这里 args 是一个函数参数包,可以包含多个实参
}
在函数中,Args... 是一个函数参数包,可以接收任意数量的函数实参。
与模板参数包不同,args 是一个值的集合,而不是类型的集合。它可以是 int、double、std::string 等具体值。
3. 省略号位置的语法总结
- 模板参数包的省略号位于
typename...或者class...之后,用于表示多个类型参数。例如:typename... Args。 - 函数参数包的省略号位于函数参数名之后,表示多个函数实参。例如:
Args... args。 - 展开参数包时,省略号紧跟在参数包上进行展开。例如:
args...,表示将args包中的所有参数逐个传递。
4. 实际应用
假设我们想编写一个通用的函数,它可以接受不同数量和类型的参数并调用它们:
template <typename F, typename... Args>
void wrapper(F&& f, Args&&... args) {
std::forward<F>(f)(std::forward<Args>(args)...); // 完美转发所有参数
}
这里的 Args... args 表示该函数可以接收多个参数,而 args... 用于展开这些参数进行实际的调用操作。
总结
- 省略号
...用于标记参数包和展开参数包。 - 省略号在 模板参数包 中跟在
typename后,表示多个类型;在 函数参数包 中跟在函数参数名后,表示多个值。 - 展开参数包时,使用
...将包内的每个参数逐个处理。
c++可变模板参数的更多相关文章
- C++模板之可变模板参数
可变模板参数---- C++11新特性 可变模板参数(variadic templates)是C++11新增的最强大的特性之一,它对参数进行了高度泛化,它能表示0到任意个数.任意类型的参数 由于可变模 ...
- c++之可变参数格式化字符串(c++11可变模板参数)
本文将使用 泛型 实现可变参数. 涉及到的关见函数: std::snprintf 1.一个例子 函数声明及定义 1 // 泛型 2 template <typename... Args> ...
- C++ 11 可变模板参数的两种展开方式
#include <iostream> #include <string> #include <stdint.h> template<typename T&g ...
- 泛化之美--C++11可变模版参数的妙用
1概述 C++11的新特性--可变模版参数(variadic templates)是C++11新增的最强大的特性之一,它对参数进行了高度泛化,它能表示0到任意个数.任意类型的参数.相比C++98/03 ...
- -C++11可变模版参数(转载)
泛化之美--C++11可变模版参数的妙用 1概述 C++11的新特性--可变模版参数(variadic templates)是C++11新增的最强大的特性之一,它对参数进行了高度泛化,它能表示0到任意 ...
- C++ 变长模板参数
转载自: http://www.cnblogs.com/liyiwen/archive/2013/04/13/3018608.html C++11 语言核心的改进中,最为关注的有 rvalue ref ...
- C++反射机制:可变参数模板实现C++反射(使用C++11的新特性--可变模版参数,只根据类的名字(字符串)创建类的实例。在Nebula高性能网络框架中大量应用)
1. 概要 本文描述一个通过C++可变参数模板实现C++反射机制的方法.该方法非常实用,在Nebula高性能网络框架中大量应用,实现了非常强大的动态加载动态创建功能.Nebula框架在码云的仓库地 ...
- 在Python中使用可变长参数列表
函数定义 在函数定义中使用*args和**kwargs传递可变长参数. *args用作传递非命名键值可变长参数列表(位置参数); **kwargs用作传递键值可变长参数列表 函数调用 在调用函数时,使 ...
- python中非关键字可变长参数和关键字变量参数的区别
#非关键字可变长参数 def add(*arg): return type(arg) print add() #打印结果 <type 'tuple'> #关键字变量参数 def ab ...
- Java中的可变长参数
可变长参数的定义 与一般方法没多大差别,只不过形参多了...(三个点) 方法名(数据类型 ... 变量名){} 小案例: public class ParamDemo { public static ...
随机推荐
- 面试题-python 什么是闭包(closure)?
前言 前面学了装饰器,那么闭包和装饰器有什么区别呢?闭包传递的是变量,而装饰器传递的是函数对象,只是传的参数内容不一样,闭包的概念包含了装饰器,可以说装饰器是闭包的一种,它只是传递函数对象的闭包. 先 ...
- centos7 最小化安装yum不能安装软件解决方案
慕课网神思者老师课常资料带的布署工具中,自带的liunx 系统centos7 yum发现不能安装软件,比如docker 解决方案 首先我们安装好虚拟机启动系统centos7 尝试安装任何软件都会报 ...
- 5/15课下作业:评价一下steam软件
用户界面: 登录后会弹出特惠广告,广告内容可能不常用.主界面简洁方便,启动游戏,购买游戏,浏览社区,浏览自己内容一目了然 记住用户选择: 登录一次后会记住用户的账户密码,可以直接进行用户间的切换,会记 ...
- 【Layui】14 代码修饰器 CodeDecorator
文档地址: https://www.layui.com/demo/code.html 基本案例: <pre class="layui-code">//在里面存放任意的代 ...
- jdk命令行工具系列——检视阅读
jdk命令行工具系列--检视阅读 参考 java虚拟机系列 RednaxelaFX知乎问答 RednaxelaFX博客 jps--虚拟机进程状态工具 jps :(JVM Process Status ...
- C# 命名空间和程序集 小记
前言 本文只是为了复习,巩固,和方便查阅,一些知识点的详细知识会通过相关链接和文献标记出来. 命名空间 1.1 概念 可以把命名空间看做字符串,他加在类名或类型名前面并且通过点进行分割 既然看做是字符 ...
- 【客户案例】白鲸开源WhaleStudio助力某证券公司打造全面数据解决方案:探析DataOps平台革新与应用
背景 近年来随着国际形势的变化,信创产业成为我国国家战略的一部分.一直以来,一直以来,全球 ICT 产业底层标准.架构.产品.生态等要素均由国外公司或机构制定和控制,使我国 ICT 产业乃至广大用户面 ...
- Spring启动报8080端口被占用问题
1.window下关闭8080端口 win+R:输入cmd,回车 在黑窗口中输入指令:netstat -ano | findstr 8080 指令的意思是找出占用8080端口的进程pid ...
- HTML+CSS+JS实现的贪吃球小游戏【转】
转载地址:[https://blog.csdn.net/qq_43115104/article/details/84228987] <!DOCTYPE html> <html> ...
- dubbo序列化问题(三)子类覆盖父类字段hession反序列化获取不到
转
在进行dubbo开发中遇到一个问题,当是用hession2进行序列化时,子类和父类有相同的字段时,hession2反序列化获取不到该字段数据,如下: import java.io.Serializab ...