如何在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";
    }
}

Running on Godbolt

,

您可以创建课程:

struct Action
{
    Action operator() { return next(); }

    std::function<Action()> next;
};

Demo

,

实际上我认为这是一个无效的问题

即使可以“解决”它也不可用

在我的任务返回false之前,我将其设置为task = {return false;};来清除当前任务

但是使用建议的设置,我将不得不返回{return {return ...}},但这根本不起作用!

我相信您不可能执行task = task()。