gpt4 book ai didi

c++ - 有什么优雅的方法吗? (类型参数包)

转载 作者:行者123 更新时间:2023-11-27 22:35:21 24 4
gpt4 key购买 nike

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

下面是我已经尝试过的,但它只调用了基函数(Called base function with AModule class and didn't call the function with 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...>(); , 直到 Tail...不为空称为 Head/Tail...递归版本。

Tail...是空的,init<Tail...>()init<>()所以 Head/Tail...版本不再匹配(没有 Head )但匹配 int = 0版本;所以init<>()成为init<0>()并且地面什么都不做的情况停止递归。

关于c++ - 有什么优雅的方法吗? (类型参数包),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55112770/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com