c++11 可变参数模板函数

c++11 可变参数模板函数

#define _CRT_SECURE_NO_WARNINGS

#include <iostream>
#include <string>
#include <vector>
#include <map>

// 在C++11之前,类模板和函数模板只能含有固定数量的模板参数。C++11增强了模板功能,允许模板定义中包含0到任意个模板参数,这就是可变参数模板。

// 可变参数模板和普通模板的语义是一样的,只是写法上稍有区别,声明可变参数模板时需要在typename或class后面带上省略号“...”
/*
省略号“...”的作用有两个:
    1)    声明一个参数包,这个参数包中可以包含0到任意个模板参数
    2)    在模板定义的右边,可以将参数包展开成一个一个独立的参数
*/
template<class ... T>
void func(T ... args) // T叫模板参数包,args叫函数参数包
{//可变参数模板函数

}

func();    // OK:args不含有任何实参
func(1);    // OK:args含有一个实参:int
func(2, 1.0);   // OK:args含有两个实参int和double

// 一个可变参数模板函数的定义
template<class ... T> void func1(T ... args)
{//可变参数模板函数
    //sizeof...(sizeof后面有3个小点)计算变参个数
    cout << "num = " << sizeof...(args) << endl;
}

// 通过递归函数展开参数包,需要提供一个参数包展开的函数和一个递归终止函数。
//递归终止函数
void debug()
{
    cout << "empty\n";
}

//展开函数
template <class T, class ... Args>
void debug(T first, Args ... last)
{
    cout << "parameter " << first << endl;
    debug(last...);
}

// 非递归方式展开
template <class T>
void print(T arg)
{
    cout << arg << endl;
}

template <class ... Args>
void expand(Args ... args)
{
    int a[] = { (print(args), 0)... };
}

void mytest()
{
    func1();     // num = 0
    func1(1);    // num = 1
    func1(2, 1.0);   // num = 2

    debug(1, 2, 3, 4);
    /*
    运行结果:
        parameter 1
        parameter 2
        parameter 3
        parameter 4
        empty
    */

    expand(1, 2, 3, 4);

    return;
}

int main()
{
    mytest();

    system("pause");
    return 0;
}
时间: 2024-10-02 19:39:09

c++11 可变参数模板函数的相关文章

C++ 11 可变参数模板和 boost::any 实现可变参数函数

1 class SqlHelper 2 { 3 public: 4 template <typename... Params> 5 static bool preparedExecute(sql::PreparedStatement* pstmt, Params... parameters) 6 { 7 return doPreparedExecute(pstmt, 1, parameters...); 8 } 9 10 private: 11 template <typename...

C++的可变参数模板函数

可变参数模板函数写法: 模板参数里写typename... args,表明args是一个可变参数. 之后再函数参数里args后面也要加...,以表示该参数为可变参数. 函数参数中对于args的修饰,会扩展到所有该args的参数,比如下面代码: //可变参数模板函数使用方法1:递归调用,每次将可变参数规模变小直到为0 template<typename T> void print(const T& x) { cout << "最后一次调用print,输出:"

c++11可变参数模板的使用1

1.概述 C++11的新特性--可变模版参数(variadic templates)是C++11新增的最强大的特性之一,它对参数进行了高度泛化,它能表示0到任意个数.任意类型的参数.相比C++98/03,类模版和函数模版中只能含固定数量的模版参数,可变模版参数无疑是一个巨大的改进.然而由于可变模版参数比较抽象,使用起来需要一定的技巧,所以它也是C++11中最难理解和掌握的特性之一. 虽然掌握可变模版参数有一定难度,但是它却是C++11中最有意思的一个特性,本文希望带领读者由浅入深的认识和掌握这一

C++11 可变参数模板构造string列表

#include <iostream> #include <cstdint> #include <list> #include <string> template<typename T> typename std::enable_if<std::is_integral<T>::value, std::string>::type to_string(const T & val) { return std::to_st

第21课 可变参数模板(2)_展开参数包

1. 可变参数模板函数 (1)递归函数方式展开参数包 ①一般需要提供前向声明.一个参数包的展开函数和一个递归终止函数. ②前向声明有时可省略,递归终止函数可以是0个或n个参数 (2)逗号表达式和初始化列表方式展开参数包 ①逗号表达式按顺序执行,返回最后一个表达式的值. ②initilizer_list可接受任意多个不同类型的参数. ③借助逗号表达式来展开包,并将返回的结果用于初始化initilizer_list. [编程实验]展开可变参数模板函数的参数包 #include <iostream>

C++反射机制:可变参数模板实现C++反射

1. 概要   本文描述一个通过C++可变参数模板实现C++反射机制的方法.该方法非常实用,在Nebula高性能网络框架中大量应用,实现了非常强大的动态加载动态创建功能.Nebula框架在coding.net的仓库地址.   C++11的新特性--可变模版参数(variadic templates)是C++11新增的最强大的特性之一,它对参数进行了高度泛化,它能表示0到任意个数.任意类型的参数.关于可变参数模板的原理和应用不是本文重点,不过通过本文中的例子也可充分了解可变参数模板是如何应用的.

可变参数模板用法

//可变参数模板 //可变参数模板,可以创建可接受可变数量参数的模板函数和模板类 //本程序通过模板函数来实例一下可变参数模板的基本用法 #include<iostream> using namespace std; void one(){}//当最后一个参数传完后,需要一个无参的重载版本 template <typename T>//当只剩最后一个参数时,编译器优先选择此模板,这样最后一个输出后面就没有逗号了 void one(T v) { cout << v <

c++11 lambda(匿名函数)

#include <iostream> #include <functional> using namespace std::placeholders; //lambda即匿名函数 int main() { int a = 10; //当return所有的返回都是一个类型就不需要指定返回值的类型,因为编译器会自动推断 //也可以指定返回值类型形式:[]()->int{return 1}; //格式:[captures] (params) -> ret {Statment

初窥c++11:lambda函数

为什么需要lambda函数 匿名函数是许多编程语言都支持的概念,有函数体,没有函数名.1958年,lisp首先采用匿名函数,匿名函数最常用的是作为回调函数的值.正因为有这样的需求,c++引入了lambda 函数,你可以在你的源码中内联一个lambda函数,这就使得创建快速的,一次性的函数变得简单了.例如,你可以把lambda函数可在参数中传递给std::sort函数 #include <algorithm> #include <cmath> void abssort(float*