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 ...
随机推荐
- 从DDPM到DDIM (一) 极大似然估计与证据下界
从DDPM到DDIM (一) 极大似然估计与证据下界 现在网络上关于DDPM和DDIM的讲解有很多,但无论什么样的讲解,都不如自己推到一遍来的痛快.笔者希望就这篇文章,从头到尾对扩散模型做一次完整 ...
- selenium高亮显示定位到的页面元素
from selenium import webdriver import unittest,time def highLightElement(driver,element): #封装好的高亮显示页 ...
- redis实现分片集群
为什么要使用分片集群? 主从和哨兵可以解决高可用.高并发读的问题.但是仍存在海量数据存储.高并发写问题 分片集群特征: 集群中有多个master,每个master保存不同数据. 为master置备了后 ...
- app专项测试:app弱网测试(网络测试流程)
app专项测试:app弱网测试(网络测试流程) 一.网络测试的一般流程 step1:首先要考虑网络正常的情况 ① 各个模块的功能正常可用 ② 页面元素/数据显示正常 step2:其次要考虑无网络的情况 ...
- 【Vue】Re17 Router 第四部分(参数传递,守卫函数)
一.案例搭建 新建Profile组件 组件写好内容后配置路由 { path : '/profile', component : () => import('../components/Profi ...
- 某宝购入牙膏厂U后其售后事宜的思虑
近日某宝购入i7 9700k, 突然想去保修的问题(没有发票,要发票比京东自营贵200左右, 不要则便宜100左右),由于确实囊中幸亏所以还是选择了某宝,东西到手后突然想起这东西没票是否可以保修 ...
- PyTorch显存机制分析——显存碎片问题
参考前文: https://www.cnblogs.com/devilmaycry812839668/p/15578068.html ================================= ...
- java多线程之-CAS无锁-unsafe理解
1.背景 这一节我们来学习一下unsafe对象 2.案例 1.自定义一个获取unsafe对象的类 package com.ldp.demo07Unfase; import sun.misc.Unsaf ...
- PHP 红包功能代码
前段时间被问这个问题,最近有空就写写啦,还是挺有趣的 首先做下抢红包方法分类: 对于发红包的人来说,一共有大致3类(其他的我暂时没想到,有想到可以联系我呀~) 一.拼手气红包个数不定(完全看运气) 二 ...
- 关于Vue + element plus包装Component理解
关于Vue + element plus包装Component理解 一.关于编写思路 我以设计el-select选择框进行举例说明 父组件与Component传递params与Function使用Pr ...