IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> c++11 学习笔记 -可变参数模板 -> 正文阅读

[C++知识库]c++11 学习笔记 -可变参数模板

可变参数模板代码实践,发给大家共勉!

/**
 * 可变模板参数
 *
 * 田志泽 Tian zhize
 * tianzhize137@163.com
 * 背景
 *  1、c++11 之前只能是固定的模板参数
 * 
 * 模板函数 可变模板参数展示
 *  递归展开
 *      1、常见的方式
 *      2、需要有同名的终止函数
 * 
 *  逗号+初始化列表展开
 *      1、逗号列表,(exp,exp2) 会执行所有的表达是,但是最后等于exp2
 *      2、可以initializer_list<int> {}
 * 类 可变参数模板展示
 *  模板特化展开
 *  继承展开
 * 
 * notice 
 *  1、继承时候最后定义成struct 不要是 class , 因为calss 有权限问题
 * 
 * sizeof
 *  使用sizeof...(args) 可以获取参数个数
 * 
*/
#include <iostream>
#include <typeinfo> // 使用typeid
#include <tuple> //tuple 
#include <algorithm>

using namespace std;
/**
 *  可变模板参数定义
 *  1、模板参数,... 放到class后,类型之前,表示 U 有多个
 *  2、在参数之前,表示 args 有多个
 */
template <class ... U>
void func(U... args) {
    cout <<sizeof...(args) << endl;
}

/**
 * 展开参数包
 * 1、递归方式
 * 2、逗号分割符
 */
void print() {

}
template<class T,class ...Args>
void print(T t, Args ...args) {
    cout << t << endl;
    print(args...);
}

/**
 * 遍历tuple
 */
template<int I = 0, class Tuple>
typename enable_if<I == tuple_size<Tuple>::value>::type printTp() {
    
}

template<int I = 0, class Tuple>
typename enable_if<I < tuple_size<Tuple>::value>::type printTp() {
    printTp<I+1>();
}

/**
 * 逗号+初始化列表
 */
template<class U> 
void print(U u) {
    cout << u << endl;
}
template<class ...Args> 
void func1(Args ...arg) {
    int arr[] = {(print(arg),0)...}; //逗号+初始化列表
    initializer_list<int> a{(print(arg),0)...}; //
    
    //gcc 还不支持
    //initializer_list<int> b{([&]{print(arg);}(),0)...}; //lambda

}

/**
 * 可变模板类
 * 1、特化展开
 * 2、基础展开
 */

// 第一部分,前项声明,这是可变参数模板类
template <class ...Args> 
class Sum {

};

// 第二部分,如何展开的部分
template <class First, class ...Rest> 
class Sum<First, Rest ...> { //类上添加<> 表示特化
    enum { value = Sum<First>::value + Sum<Rest...>::value};
};

// 第三部分,特化的终止类
template <class Last> 
class Sum<Last> {
    enum{ value = sizeof(Last)};
};

/**
 * 继承方法展开 可变参数模板类
 * 1、notice 继承时候最后定义成struct 不要是 class , 因为calss 有权限问题
 */
// 第一部分前置声明
template<int ...>
class IndexSeq{};

// 第二部分
template<int N, int ... Rest>
struct MakeIndex : MakeIndex<N - 1, N-1, Rest...> {
};

// 第三部分,终止类
template<int ...Indexes> 
struct MakeIndex<0, Indexes...> { //在N 等于 0的时候终止
    typedef IndexSeq<Indexes...> type;
};

void test_class_variable_template() {
    using T = MakeIndex<3>::type;
    cout << typeid(T).name() << endl;

}

// 使用 Index 和 tuple 打印模板参数
template<int ...Indexes, class ... Args>
void helper_tuple(IndexSeq<Indexes...> index,tuple<Args...> tup) {
    print(get<Indexes>(tup)...);
}

template <class ...Args> 
void printArgs(Args ... args) {
    //sizeof...(args) 可以获取参数个数
    helper_tuple(typename MakeIndex<sizeof...(Args)>::type(),make_tuple(args...));
}

int main() {
    // func();
    // func(1,2);

    // func1(1,2);
    printArgs(1,3,4,5);
    system("pause");
}
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-08-29 08:54:26  更:2021-08-29 08:55:25 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 17:00:28-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码