美文网首页
C++变参模板

C++变参模板

作者: 仰简 | 来源:发表于2023-02-01 23:33 被阅读0次

一、变参模板的定义

变参模板的意思说的是从 C++ 11 开始,模板参数接受不变的个数。类似于 C 语言中的 printf() 函数一样。

二、变参模板的定义及使用

定义一个变参模板,其中 print() 为重载的函数,第一个是普通的函数,第二个变参模板函数。

void print() {
    std::cout << "print over" << std::endl;
}

template<typename T, typename...Types>
void print(T firstArgs, Types...args) {
    std::cout << firstArgs << std::endl;
    std::cout << "types: " << sizeof...(Types) << std::endl;
    std::cout << "args: " << sizeof...(args) << std::endl;
    print(args...);
}

然后,调用如下

print(7.5, "Hello", "World");

我们可以传入任意类型及个数的参数,前面会一直递归调用变参模板函数,然后在没有参数后,调用 print() 退出递归。
上面注意,定义变参 type 时,如下在 typename 后面加...

typename... Types

声明参数时,在 Types 后面加...

Types... args

而使用参数时,在 args 后面...

args...

也就是说都是在关键字、类型、参数后面加 ...

三、变参模板的其他主题

1. 新的运算符, sizeof...()
sizeof...() 既可以计算 Types 的个数,也可以计算 args 的个数,如上 demo 中。

2. 折叠表达式
从 c++17 开始提供了一个二元运算符,可以在直接计算出变参参数的结果。

template<typename...Types>
auto foldSum(Types... t) {
    return (... + t);
}

折叠表达式的几种形式如下


image.png

3. 变参模板在实际中的使用
智能指针 std::make_shared 如 std::make_shared<T>(1,2,3,4....)
std::vector 的 emplace() ,如 emplace(1,2,3,4,"hello")
std::thread 线程函数的参数 ,如 std::thread(func, 1, 2, "hello");

其他更多主题待参考。

相关文章

  • C++变参模板

    一、变参模板的定义 变参模板的意思说的是从 C++ 11 开始,模板参数接受不变的个数。类似于 C 语言中的 pr...

  • 模板与泛型 —— 可变参模板

    一、可变参函数模板 二、可变参类模板 C++ 11 中引入了 可变参模板 (Variadic Template):...

  • 函数变参的使用

    介绍C/C++,java,和go语言对函数变参的使用。 1. C/C++语言的变参 1.1 变参函数声明 变参函数...

  • 力卉编程 | C语言 | 模板类定义

    C++ 中类模板的写法如下: template <类型参数表>class 类模板名{成员函数和成员变量}; 类型参...

  • Geekband C++ 第五周

    概述 C++模板简介 函数模板 C++类模板 操作符重载 泛型编程 容器

  • 【C++】面向对象之C++模板-005

    第五章 C++模板 5.1 模板概论 c++提供了函数模板(function template.)所谓函数模板,实...

  • template 模板

    两种通式:函数模板通式,类模板通式 一、函数模板通式 二、类模板通式 三种类型的模板形参:类型形参,非类型形参和模...

  • GeekBand STL与泛型编程 第一周

    1.模板观念与函数模板 课程主要内容 C++模板简介 泛型编程 容器 进阶 C++模板简介   generic t...

  • 函数 三

    无参装饰器模板 有参装饰器模板 叠加多个装饰器

  • C++ STL(1)

    C++ STL(1) from my csdn blog C++标准模板库 容器C++标准模板库提供了10种容器基...

网友评论

      本文标题:C++变参模板

      本文链接:https://www.haomeiwen.com/subject/pvhwhdtx.html