可变参数模版

 

//模版头
template < typename ... Args> //Args 是模版参数包
void print( Args ... args)           //args 是函数参数包
{
    print(args...)   //展开函数参数包    
}
/*
    以上是一个可变参数模版的基本写法;
    有3个点在 Args与 args 前; 意味这是一个包;
    可以理解为 :
    ...在参数前是  聚合参数
    ...在参数后是  展开参数
*/

如有一下调用:
print("123",123,4.5); 
相当于生成一个 : print(const char*, int,double) 函数实例;

通常可变参数模版是用来递归的.但上面的函数将导致无穷递归;
下面是解决办法;

//main.cpp

//新增的一个模版,用于最后一次打印
template <typename T>
void print(const T& t)
{
    cout << t << endl;
}

//原来的模版,修改版 
template <typename T , typename ... Args>
//类型前加了const , 以及引用 ; 额外增加了第一个参数t
void print(const T& t, const Args& ... args) 
{
    cout << t << ' ';
    print(args...);
}

//如果有如此调用
print(1,'a',4.5,"nihao");
那么, 'a',4.5,"nihao"3个参数将被聚合.
即第一次调用将输出  1 ; 
函数原型: 
print(const int&,const char&,const double&,const char*&);

第2次调用将输出 'a';
函数原型:
print(const char&,const double&,const char*&);

每一次从函数参数包中取出一个, 按以上推导,最后一次将调用新增的函数模版;





 

### 可变参数模板的基础概念 C++中的可变参数模板(Variadic Templates)允许函数或类接受不定数量的数。这种特性使得开发者可以更灵活地设计泛型代码,尤其是在处理复杂数据结构或者实现类似于`std::tuple`的功能时[^1]。 以下是关于如何定义和使用可变参数模板的一个基本示例: ```cpp // 定义一个简单的可变参数模板函数 template<typename... Args> void variadicFunction(Args... args) { ((std::cout << args), ...); // 使用折叠表达式打印所有数 } int main() { variadicFunction(1, 2.5, std::string("hello")); // 调用该函数并传递不同类型的数 } ``` 上述代码展示了通过可变参数模板创建能够接收任意数量和类型数的函数的方法。这里的关键在于省略号运算符(`...`)的应用,它用于展开数包。 ### 实现细节与技术要点 当涉及到具体实现时,递归是一个常见的模式。下面的例子说明了如何利用递归来计算一组数值之和: ```cpp #include <iostream> // 基础情况:无数时返回0 template<typename T> T sum(T t) { return t; } // 递归版本:逐步减少数列表直到只剩下一个数 template<typename T, typename... Ts> T sum(T first, Ts... rest) { return first + sum(rest...); } int main(){ int result = sum(1, 2, 3, 4, 5); std::cout << "Sum is: " << result; } ``` 此程序片段显示了一个典型的递归分解过程,在每次调用中都将当前头元素与其他剩余部分分离出来,并最终累加得到总和。 另外需要注意的是,虽然RTTI(Runtime Type Information)并非直接关联于variadic templates的核心功能,但在某些场景下可能被间接涉及;而constexpr functions则提供了编译期执行能力的支持,这些都属于现代C++编程的重要组成部分之一。 ### 结合Typelist的设计考量 考虑到引用材料提到的内容,《C++ Templates》一书中讨论了许多基础知识点以及高级应用实例[^2]。例如在构建自定义容器如MyType时可能会遇到的需求——即需要为其成员量指定特定迭代器类别,则可以通过如下方式完成设置: ```cpp template<class T> struct MyType{ using value_type = T; class iterator {}; }; ``` 以上代码段展示了一种简单形式下的内部嵌套定义方法来满足此类需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值