只谈C++11新特性 - 模板参数包、函数参数包以及 `sizeof...`

模板参数包、函数参数包以及 sizeof...

C++11 带来了模板参数包、函数参数包以及新的 sizeof... 运算符。这些特性解决了不定长参数的处理问题,使得模板和函数更加灵活和通用。


模板参数包

模板参数包是 C++11 中新增的功能,用于在模板中接收不定数量的类型参数。例如:

#include <iostream>

// 通用模板函数接受不定数量的类型
template<typename... Args>
void printTypeCount() {
    std::cout << "Number of types: " << sizeof...(Args) << std::endl;
}

int main() {
    printTypeCount<int, double, char>(); // Output: Number of types: 3
    printTypeCount<>(); // Output: Number of types: 0
    return 0;
}

解释

  • Args... 是模板参数包,表示可以接收任意数量的模板参数。
  • sizeof...(Args) 是 C++11 中新增的运算符,用于在编译时获取模板参数包的参数个数。

模板参数包非常适合不定长类型传参的场景。


函数参数包

函数参数包允许在函数中接收不定数量的运行时实例参数,例如:

#include <iostream>

void print() {
    std::cout << "No arguments." << std::endl;
}

template<typename T, typename... Args>
void print(T first, Args... args) {
    std::cout << first << std::endl;
    print(args...); // 递归传递剩余参数
}

int main() {
    print(1, 2.5, "hello", 'c');
    return 0;
}

输出结果

1
2.5
hello
c
No arguments.

解释

  • Args... 是函数参数包,表示可以接收任意数量的运行时参数。
  • 函数通过递归调用的方式依次处理参数包中的每个参数,直到参数包为空。

函数参数包适合动态处理多参数的运行时场景。


模板参数包与函数参数包的配合

将模板参数包与函数参数包结合使用,可以实现更通用的代码。例如:

#include <iostream>

// 通用模板函数,支持模板和实例参数包
template<typename... Args>
void printAll(Args... args) {
    print(args...);
}

int main() {
    printAll(42, 3.14, "C++11", 'x');
    return 0;
}

解释

  • 模板参数包(Args...)定义了可接收任意类型的模板参数。
  • 函数参数包(args...)允许传递任意数量的实例参数。
  • 通过调用 print(args...) 逐一处理参数包。

这种组合方式在复杂场景下减少了代码重复和错误率。


sizeof... 运算符的补充

sizeof... 运算符不仅可以用在模板参数包中,也可以用在函数参数包中。例如:

#include <iostream>

template<typename... Args>
void countAndPrint(Args... args) {
    std::cout << "Number of arguments: " << sizeof...(args) << std::endl;
    print(args...);
}

int main() {
    countAndPrint(10, 20.5, "example"); // Output: Number of arguments: 3
    return 0;
}

解释

  • sizeof...(args) 用于在运行时统计函数参数包中的参数个数。

总结

C++11 中的模板参数包、函数参数包和 sizeof... 运算符是解决不定长参数的核心特性:

  1. 模板参数包:在编译时接收不定数量的类型参数。
  2. 函数参数包:在运行时接收不定数量的实例参数。
  3. sizeof... 运算符:统计模板参数包或函数参数包中的参数个数。

这些特性使得 C++ 的模板与函数更通用、更灵活,是 C++11 的重要改进之一。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值