首页 > 解决方案 > 有什么优雅的方法吗?(类型参数包)

问题描述

我想创建一个接受类型并通过循环或递归再次调用自身的函数。

我已经尝试过的是下面,但它只调用了基函数(用AModule类调用了基函数,没有用BModule.

class AModule {
};
class BModule {
};

auto main() -> int {
  init<AModule, BModule>()
  return 0;
}

template<typename Module>
void init() {
  // BASE FUNCTION
  // Do something
}

template<typename... Modules>
void init() {
  (init<Modules>(), ...)
}

标签: c++templatesrecursionc++17variadic-templates

解决方案


在您的示例代码中,您使用的是模板折叠,这是一个新的 C++17 功能,可让您避免递归。

但是,为了避免名称冲突,我建议以不同的方式调用基本版本;说do_something()

template<typename Module>
void do_something() {
  // BASE FUNCTION
  // Do something
}

template<typename... Modules>
void init() {
  (do_something<Modules>(), ...);
}

如果您真的想使用递归方式,您可以执行以下操作

template <int = 0>
void init ()
 {
  // stop recursion; do nothing
 }

template <typename Head, typename ... Tail>
void init () 
 {
   // do something with Head

   // recursively call init()
   init<Tail...>();
 }

诀窍是调用init<Tail...>();, untilTail...不为空称为Head/Tail...递归版本。

Tail...为空时,init<Tail...>()/init<>()版本Head不再Tail...匹配(没有 a Head)但匹配int = 0版本;如此init<>()成为init<0>(),地面无所事事的情况停止递归。


推荐阅读