省略号和可变参数模板

可变参数模板用两种方法使用省略号。 参数名称的左侧表示参数包,参数名称的右侧将参数包扩展为单独的名称。
可变参数模板类定义语法的基本示例:

template<typename... Arguments> class classname;  

Arguments 是参数包。 类 classname 可以接受参数数目可变,例如:

template<typename... Arguments> class vtclass;  

vtclass< > vtinstance1;  
vtclass<int> vtinstance2;  
vtclass<float, bool> vtinstance3;  
vtclass<long, std::vector<int>, std::string> vtinstance4;  

通过使用可变参数模板类定义,您还可以要求至少一个参数。例如:

template <typename First, typename... Rest> class classname;   

可变参数模板函数语法的基本示例:

template <typename... Arguments> returntype functionname(Arguments... args);  

variadic 模板函数语法还可能有其他形式,包括不限制于:

template <typename... Arguments> returntype functionname(Arguments&... args);   
template <typename... Arguments> returntype functionname(Arguments&&... args);  
template <typename... Arguments> returntype functionname(Arguments*... args);  

还允许使用类似 const 的说明符:

template <typename... Arguments> returntype functionname(const Arguments&... args);  

按照可变参数模板类的定义,您可以创建需要至少一个参数的函数:

template <typename First, typename... Rest> returntype functionname(const First& first, const Rest&... args); 

可变模板使用 sizeof…() 运算符(与更早的 sizeof() 运算符不相关):

template<typename... Arguments>  
void tfunc(const Arguments&... args)  
{  
    const unsigned numargs = sizeof...(Arguments);  

    X xobj[numargs]; // array of some previously defined type X  

    helper_func(xobj, args...);  
}  

sizeof…()返回参数的数量。
示例:

#include <iostream>  

using namespace std;  

void print() {  
    cout << endl;  
}  

template <typename T> void print(const T& t) {  
    cout << t << endl;  
}  

template <typename First, typename... Rest> void print(const First& first, const Rest&... rest) {  
    cout << first << ", ";  
    print(rest...); // recursive call using pack expansion syntax  
}  

int main()  
{  
    print(); // calls first overload, outputting only a newline  
    print(1); // calls second overload  

    // these call the third overload, the variadic template,   
    // which uses recursion as needed.  
    print(10, 20);  
    print(100, 200, 300);  
    print("first", 2, "third", 3.14159);  
}  

输出:

1  
10, 20  
100, 200, 300  
first, 2, third, 3.14159  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值