一:概述
C++ 变长模板(Variadic Templates)允许你定义接受任意数量模板参数的模板。这种功能在 C++11 中引入,非常灵活,常用于实现类型安全的容器、函数等。变长模板基本语法:
template<typename... Args>
void func(Args... args) {
// 函数体
}
二:示例:
#include <iostream>
// 递归基础案例
void print() {
std::cout << std::endl;
}
// 变长模板递归
template<typename T, typename... Args>
void print(T first, Args... args) {
std::cout << first << " ";
print(args...); // 递归调用
}
int main() {
print(1, 2.5, "hello", 'c'); // 输出: 1 2.5 hello c
return 0;
}
#include <iostream>
template <typename... Args>
int printSize(Args... args){
return sizeof ...(args);
}
template<int ...>
struct Mult;
template<>
struct Mult<>{
static const int value= 1;
};
template<int i, int ... tail>
struct Mult<i, tail ...>{
static const int value= i * Mult<tail ...>::value;
};
int main(){
std::cout << '\n';
std::cout << "printSize(): " << printSize() << '\n';
std::cout << "printSize(template,2011,true): " << printSize("template",2011,true) << '\n';
std::cout << "printSize(1, 2.5, 4, 5, 10): " << printSize(1, 2.5, 4, 5, 10) << '\n';
std::cout << '\n';
std::cout << "Mult<10>::value: " << Mult<10>::value << '\n';
std::cout << "Mult<10,10,10>::value: " << Mult<10,10,10>::value << '\n';
std::cout << "Mult<1,2,3,4,5>::value: " << Mult<1,2,3,4,5>::value << '\n';
std::cout << '\n';
}
三:注意事项
- 类型匹配:在使用变长模板时,确保所有参数的类型正确匹配。编译器在处理变长模板时会检查类型。
- 递归限制:过多的递归可能导致编译器的栈溢出,需谨慎使用。
- 模板特化:可以对变长模板进行特化,以便为特定类型或数量的参数提供不同的实现。