Variadic Templates [参数不定的模板参数] 特性与优缺点

  • Post author:
  • Post category:其他

Variadic Template是C++11的一个很重要的特性:

  1. 参数个数:利用参数个数逐一递减的特性,实现递归调用;
  2. 参数类型:参数个数逐一递减导致参数类型也逐一递减;

Variadic Template 的缺点:

  1. 只能在同一个代码文件中调用,如果在静态库或者动态库则无法正常调用
  2. 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 版权协议,转载请附上原文出处链接和本声明。