本文主要是介绍Variadic Templates [参数不定的模板参数] 特性与优缺点,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
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);
}
这篇关于Variadic Templates [参数不定的模板参数] 特性与优缺点的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!