Variadic Template是C++11的一个很重要的特性:
- 参数个数:利用参数个数逐一递减的特性,实现递归调用;
- 参数类型:参数个数逐一递减导致参数类型也逐一递减;
Variadic Template 的缺点:
- 只能在同一个代码文件中调用,如果在静态库或者动态库则无法正常调用
- Variadic Template是一种与编译有关的特性,属于静态的;编译器编译时会扫描本文件中所有的调用规则自动生成模块类型
下面是最基本的示例代码:
#include <iostream>
void print() {
}
template<typename T,typename...Types>
void print(const T& firstArg, const Types&...args) {
std::cout << firstArg << std::endl;
print(args...);
}
auto main() -> int {
print(7.5, "hello", 42);
return 0;
}
无法正常使用情况:
print.h
void print();
template<typename T,typename...Types>
void print(const T& firstArg, const Types&...args);
print.cpp
#include <iostream>
#include "print.h"
void print() {
}
template<typename T,typename...Types>
void print(const T& firstArg, const Types&...args) {
std::cout << firstArg << std::endl;
print(args...);
}
main.cpp
#include <iostream>
#include "print.h"
auto main() -> int {
print(7.5, "hello", 42); // 编译失败
return 0;
}
怎么可以让上面的编译成功呢?那么是要修改print.cpp的代码,添加一个与main函数中对print函数一样的参数调用,则会让上面的编译通过,这说明Variadic Template是一种静态生成的语言特性
#include <iostream>
#include "print.h"
void print() {
}
template<typename T,typename...Types>
void print(const T& firstArg, const Types&...args) {
std::cout << firstArg << std::endl;
print(args...);
}
void test() {
print(1.5, "test", 3);
}
版权声明:本文为u010015695原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。