如何解决如何在C ++中定义“递归”函数类型?
我有任务,任务会执行某些操作,如果必须再次调用它,则返回True。
function<bool()> currentAction;
我本来打算用这样的东西来管理我当前的任务。
if (!currentAction())
currentAction = []() { return false; };
然后我改变了主意,想要这样的东西
currentAction = currentAction();
但是什么是CurrentAction的合适类型?
它必须是一个函数,该函数返回一个函数,该函数返回一个...... p
function<function<function<function<function<**[keep inserting here!]**()>()>()>()>()> currentAction;
解决方法
表达递归类型总是在某个地方涉及包装器:
struct task : std::function<task()> { using std::function<task()>::function; };
但是他们没有任何问题:
// "infinitely" recursive (UB when offset overflows,can use unsigned to make truly infinite)
task iota(int &out,int offset = 0) {
return [&out,offset] {
out = offset;
return iota(out,offset + 1);
};
}
这是一个最终“失败”(返回空task
)的任务的示例:
task limit(task t,int n) {
if(n <= 0) return nullptr;
else return [t = std::move(t),n]() { return limit(t(),n - 1); };
}
这是您可能会使用它们的方式:
// prints integers [0,42)
int main() {
int i;
task next = limit(iota(i),42);
while(next) {
next = next();
std::cout << i << "\n";
}
}
,
您可以创建课程:
struct Action
{
Action operator() { return next(); }
std::function<Action()> next;
};
,
实际上我认为这是一个无效的问题
即使可以“解决”它也不可用
在我的任务返回false之前,我将其设置为task = {return false;};来清除当前任务
但是使用建议的设置,我将不得不返回{return {return ...}},但这根本不起作用!
我相信您不可能执行task = task()。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。