Colderleo's blog Colderleo's blog
首页
Linux
C++
Python
前端
工具软件
mysql
索引
关于
GitHub (opens new window)

Colder Leo

热爱代码的打工人
首页
Linux
C++
Python
前端
工具软件
mysql
索引
关于
GitHub (opens new window)
  • bug定位的一些情形
  • c++性能调优,可能的情况
  • total-编程知识点集锦
  • hpc_common.hpp
  • memory order 内存模型
  • 类型推导之auto-template-decltype
  • 完美转发forward源码分析
  • 左值和右值,右值引用、重载 std-move,引用折叠
  • cmake用法
  • alignas、alignof、sizeof实现内存对齐分配
  • 通过宏定义控制debug打印
  • 程序耗时性能测试
  • 线程池开源项目阅读
  • C++类中包含没有默认构造函数的成员
  • C++可变参数模板
    • 模板参数包
    • 可变模版参数函数和可变模版参数类
    • 泛化展开
  • C++属性继承 public protected private
  • C++智能指针
  • C++导出so的方法,以及extern C 注意事项
  • 四种spin lock
  • condition_variable和unique_lock
  • dpdk、kernel bypass
  • 智能网卡solarflare、Mellanox、X10等
  • 汇编寄存器和常见指令
  • c++ 类的静态成员变量未定义
  • C++获取类成员函数地址
  • preload示例
  • C++异常安全和RAII
  • C++11单例模式
  • C++歪门邪道
  • boost-program-option用法
  • c++17通过模板获取类成员的个数
  • 通过模板实现结构体成员拷贝-按成员名匹配
  • STL学习路径
  • boost库安装使用方法
  • C++文件读写
  • linux下socket通信demo,server和client
  • makefile写法
  • RxCpp
  • C++
gaoliu
2021-10-28
目录

C++可变参数模板

# 模板参数包

# 概念

模板参数包就是把若干个模板参数打包成一个。

template <typename... T> //声明一个类型为... 的T, 就是一个模板参数包
void f(T... args);
1
2

可以把...看成类型说明符,类似于*。

# 包扩展表达式

参考: https://www.cnblogs.com/Glucklichste/p/11175769.html (opens new window)

设args被声明为一个函数参数包,其扩展方式有

  • printArgs(args…) 相当于printArgs(args1,args2,…,argsN)

  • printArgs(args)… 相当于printArgs(args1),…, printArgs(argsN)

  • (printArgs(args),0)… 逗号表达式 这是一个逗号表达式。相当于(printArgs(args1),0),…(printArgs(argsN),0) 包扩展表达式“exp…”相当于将省略号左侧的参数包exp视为一个整体来进行扩展

当声明一个变量(或标识符)为可变参数时,省略号位于该变量的左侧 当使用参数包时,省略号位于参数名称的右侧,表示立即展开该参数,这个过程也被称为解包

# 示例

template <typename T> 
class Storage {
private:
    T* p;
public:
    template <typename... Args> 
    Storage(Args &&... args) {
        p = new T(std::forward<Args>(args)...);
        //相当于 std::forward(args1),…, printArgs(argsN)
    }

};
1
2
3
4
5
6
7
8
9
10
11
12

# 可变模版参数函数和可变模版参数类

# 泛化展开

参考: https://www.cnblogs.com/qicosmos/p/4325949.html (opens new window)

#include <unistd.h>
#include <stdint.h>
#include <stdio.h>
#include <string.h>
#include <string>
#include <vector>

using namespace std;

template<typename... Args>
static inline std::string get_first_exist_file(Args ...args)
{
    std::vector<std::string> filenames{args...};
    for(auto p = filenames.begin(); p != filenames.end(); ++p) {
        if(fopen(p->c_str(), "r"))
            return *p;
    }
    return std::string();
}


int main() {
    auto first_file = get_first_exist_file("aa.txt", "bb.txt");
    printf("first_file=%s\n", first_file.c_str());
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
编辑 (opens new window)
上次更新: 2023/05/07, 17:27:54
C++类中包含没有默认构造函数的成员
C++属性继承 public protected private

← C++类中包含没有默认构造函数的成员 C++属性继承 public protected private→

最近更新
01
通过模板实现结构体成员拷贝-按成员名匹配
05-07
02
c++17通过模板获取类成员的个数
05-01
03
avx-sse切换惩罚
04-30
更多文章>
Theme by Vdoing | Copyright © 2019-2023 Colder Leo | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式
×