在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 是一个值的集合,而不是类型的集合。它可以是 intdoublestd::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++可变模板参数的更多相关文章

  1. C++模板之可变模板参数

    可变模板参数---- C++11新特性 可变模板参数(variadic templates)是C++11新增的最强大的特性之一,它对参数进行了高度泛化,它能表示0到任意个数.任意类型的参数 由于可变模 ...

  2. c++之可变参数格式化字符串(c++11可变模板参数)

    本文将使用 泛型 实现可变参数. 涉及到的关见函数:  std::snprintf 1.一个例子 函数声明及定义 1 // 泛型 2 template <typename... Args> ...

  3. C++ 11 可变模板参数的两种展开方式

    #include <iostream> #include <string> #include <stdint.h> template<typename T&g ...

  4. 泛化之美--C++11可变模版参数的妙用

    1概述 C++11的新特性--可变模版参数(variadic templates)是C++11新增的最强大的特性之一,它对参数进行了高度泛化,它能表示0到任意个数.任意类型的参数.相比C++98/03 ...

  5. -C++11可变模版参数(转载)

    泛化之美--C++11可变模版参数的妙用 1概述 C++11的新特性--可变模版参数(variadic templates)是C++11新增的最强大的特性之一,它对参数进行了高度泛化,它能表示0到任意 ...

  6. C++ 变长模板参数

    转载自: http://www.cnblogs.com/liyiwen/archive/2013/04/13/3018608.html C++11 语言核心的改进中,最为关注的有 rvalue ref ...

  7. C++反射机制:可变参数模板实现C++反射(使用C++11的新特性--可变模版参数,只根据类的名字(字符串)创建类的实例。在Nebula高性能网络框架中大量应用)

    1. 概要   本文描述一个通过C++可变参数模板实现C++反射机制的方法.该方法非常实用,在Nebula高性能网络框架中大量应用,实现了非常强大的动态加载动态创建功能.Nebula框架在码云的仓库地 ...

  8. 在Python中使用可变长参数列表

    函数定义 在函数定义中使用*args和**kwargs传递可变长参数. *args用作传递非命名键值可变长参数列表(位置参数); **kwargs用作传递键值可变长参数列表 函数调用 在调用函数时,使 ...

  9. python中非关键字可变长参数和关键字变量参数的区别

    #非关键字可变长参数 def add(*arg):    return type(arg) print add() #打印结果 <type 'tuple'> #关键字变量参数 def ab ...

  10. Java中的可变长参数

    可变长参数的定义 与一般方法没多大差别,只不过形参多了...(三个点) 方法名(数据类型 ... 变量名){} 小案例: public class ParamDemo { public static ...

随机推荐

  1. mybatis-plus的BaseMapper调用报错:Invalid bound statement

    1.yml的配置, 2.@mapper/@mapperScan 3.注意版本依赖冲突,本人第一次使用spring-boot-start-parent3.2.3与mybatis-plus-start-p ...

  2. Could not retrieve mirrorlist http://mirrorlist.centos.org/?release=7&arch=x86_64&repo=os&infra=stock error was 14: curl#6 - "Could not resolve host: mirrorlist.centos.org; 未知的错误"解决yum下载报错

    报错信息 │ (SSH client, X server and network tools) │ │ │ │ ⮞ SSH session to root@192.168.117.166 │ │ • ...

  3. 【MySQL】下发功能SQL

    SQL参考文章: https://www.jb51.net/article/15627.htm 下发,就是从别的表中同步数据到此表中,也可能是来自不同库的表,或者不同实例的表 下发的逻辑要求:如果没有 ...

  4. 【Spring】03 XML配置

    Alias别名设置 可以为一个Bean的ID再设置一个ID 多一个可用标识,大概... 在获取实例注入参数时,两个标识都可以使用 除了Alias可以设置别名之外,Bean的标签本身也可以设置第二别名 ...

  5. 【JavaScript】Jquery事件绑定问题

    我们所知道的选择器方式,其中有一种方式是属性选择器: <div style="display: flex; justify-content: space-between;"& ...

  6. MindSpore分布式并行训练 (GPU-Docker)mindspore—1.2.1—gpu—docker版本运行报错,Failed to init nccl communicator for group,init nccl communicator for group nccl_world_group

    如题目所述: 计算框架MindSpore分布式并行训练报错,具体版本:docker-gpu-1.2.1 运行环境: 硬件:Intel CPU, 4卡泰坦 软件:Ubuntu18.04宿主机,docke ...

  7. Ubuntu系统中CUDA套件nvvp启动后报错Failed to load module "canberra-gtk-module"

    最近在看cuda方面的内容,需要对cuda代码做一些性能分析,于是需要使用nvvp,但是启动nvvp后报错:Failed to load module "canberra-gtk-modul ...

  8. tf.py_func的一些使用笔记——TensorFlow1.x

    tensorflow.py_func是TensorFlow1.x版本下的函数,在TensorFlow.2.x已经不建议使用了,但是依然可以通过tf.compat.v1.py_func的方式来进行调用. ...

  9. 数据库存储时间数据用timestamp 好还是 varchar好

    表示日期数据基本是date型,只有年月的用varchar2或者char,好处见下:1.数据规范.date对合法日期型会校验,包括闰年2月这种.避免字符型变量产生的某月32号,日期长度不对,日期格式不统 ...

  10. Java核心编程-第一卷:基础知识

    public static void main(String[] args) { BigInteger bigInteger1 = BigInteger.probablePrime(20, new R ...