基于std::function的递归(?)函数包装器<>

Recursive(?) function wrapper based on std::function<>

本文关键字:包装 gt lt 函数 function std 递归 基于      更新时间:2023-10-16

我想实现类似于那个的代码

using ProcessCallback = std::function<ProcessCallback (const std::vector<char>&)>
// ...
ProcessCallback callback;
// initialize callback somehow...
while (/* condition */)    {
    auto callback_successor = callback (data);
    if (callback_successor)   {
       callback = std::move (callback_successor);
    }
}

一般来说,我希望有可调用的callback对象(函数指针,等等),它将处理一些数据,并可能为连续调用替换自身。

错误很明显 - 第一行中的准递归声明无效,因为我尝试使用未声明std::function<> ProcessCallback声明基于的类型。

如何修复上述代码或如何通过其他构造实现所需的功能?用于处理的抽象函数类不是解决方案 - 我不想为每个处理函数编写从抽象类继承的新类。

我想坚持纯C++(没有嘘声等),但我不限于特定的C++版本。

编辑

实际上,我设法解决了这个问题,但是我很好奇是否有可能使初始解决方案起作用。

我想到的最简单方法是使用提供所需功能的类。举个例子:

struct Callback{
    std::function<void(void)> func;
    Callback* next = nullptr;
    Callback* call(){
        func();
        return next;
    }
};

它有点像链表,包含要调用的函数和指向下一个元素的指针。当然,它也可以(有条件地)只返回this和/或修改func以更改自己的行为,而无需指向不同的对象。 call()也可以在这里operator()(),以便更轻松地语法。

使用非常简单,通过定义指向Callback的指针,然后调用

ptr = ptr->call();

在线试用