作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个充当“函数调度”的函数。此函数包含一个名为 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
关于c++ - 函数指针困惑 : Making a function dispatcher in C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59366745/
我是一名优秀的程序员,十分优秀!