gpt4 book ai didi

c++ - 函数指针困惑 : Making a function dispatcher in C++

转载 作者:行者123 更新时间:2023-11-28 01:13:54 24 4
gpt4 key购买 nike

我有一个充当“函数调度”的函数。此函数包含一个名为 next_func 的变量,它被初始化为要加载的第一个函数。然后,在无限循环内,next_func 被设置为其自身的返回值。

我的问题是,除了使用 auto 之外,next_func 还需要是什么类型?下面是一些概念性代码(使用auto)来说明我在寻找什么:

void FunctionDispatch()
{
auto next_menu = first_menu;
while (next_menu != app_exit)
{
next_menu = next_menu();
}
}

auto first_menu()
{
auto return_menu = first_menu; // Set to itself for 'auto', but I don't want to have to do this

std::cout << "2 or 3? ";
unsigned input = 0;
std::cin >> input;

switch (input)
{
case 2:
return_menu = second_menu;
break;

case 3:
return_menu = third_menu;
break;

default:
break;
}

return return_menu;
}

我喜欢对琐碎的类型使用 auto,但我真的不喜欢依赖它,因为我不知道如何处理我想要的类型,这就是为什么我想知道 auto 实际上在这里是什么以及如何显式声明变量和函数返回类型(可能使用类型别名,因为这是最明智的)。

注意事项:

  • FunctionDispath() 可以调用的所有函数都不带参数并返回函数指针,其他函数不带参数并返回相同类型的函数指针。
  • 我更喜欢一个解释没有类型别名的完整类型的答案如何在这里使用类型别名。

最佳答案

首先,酷!这让我想起了中间件框架,或者带有任务和事件循环的协程。

如许多人所提到的,使用直接函数指针执行此操作将导致无限递归类型。但是,如果每个任务都是一个可调用对象,那么您就不需要像前向引用那样的递归类型。您可以继承 std::function 以使其变得简单:

struct task : std::function<task()> {
using std::function<task()>::function;
};

然后你可以给它分配功能。您还可以使用 std::bind 绑定(bind)参数,甚至可以使用默认构造函数创建一个没有目标的空函数:

task n_hellos(int count) {
if (count) {
std::cout << "hello\n";
return std::bind(n_hellos, count-1);
}
return task();
}

您可以将 std::function 转换为 bool 以查看它是否为空,从而允许终端情况。当下一个任务为空时,下面的事件循环退出:

int main() {
task current_task = std::bind(n_hellos, 5);
while (current_task) {
current_task = current_task();
}
} // prints "hello" five times

演示:https://godbolt.org/z/dHaSWC

关于c++ - 函数指针困惑 : Making a function dispatcher in C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59366745/

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