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

时间:2016-02-29 20:50:13

标签: c++ c++11

我希望实现类似于

的代码
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 ++(没有Boos等),但我不仅限于特定的C ++版本。

修改

实际上我设法解决了这个问题,但我很好奇是否可以使初始解决方案正常工作。

1 个答案:

答案 0 :(得分:0)

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

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

    Callback* call(){
        func();
        return next;
    }
};

它有点像链表,包含要调用的函数和指向下一个元素的指针。当然,它也可以(有条件地)返回this和/或修改func来改变自己的行为而不指向不同的对象。 <{1}}也可以call()在这里使用更简单的语法。

通过定义指向operator()()的指针然后调用

,使用非常简单
Callback

Try it online