c++ - 有什么优雅的方法吗?(类型参数包)
问题描述
我想创建一个接受类型并通过循环或递归再次调用自身的函数。
我已经尝试过的是下面,但它只调用了基函数(用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++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>()
,地面无所事事的情况停止递归。
推荐阅读
- python - Print list of lists using *(expansion operator) in single line of code
- git - 提交或推送提交时,如何自动提交/推送部分项目到另一个仓库?
- android-studio - 错误:无法创建新会话,因为找不到需要 HttpClient、InputStream 和 long 的“createSession”
- google-sheets - 从单元格中删除不需要的文本
- javascript - JSDOM:dom.window.document.innerHTML 未定义
- python-3.x - MongoDb查询以获取具有条件的集合中的所有变量值
- ios - 如何在 SwiftUI 中实现自定义日历?
- javascript - 从更改事件中获取旧值
- python - 你好!我正在努力尝试让一个while循环工作
- javascript - 带有id的VueJs拼接行