c++ - 如何做一个简单的C++通用回调?

标签 c++ callback

假设我有以下代码:

class A
{
public:
    A() {}

    int f(void*, void*)
    {
        return 0;
    }
};

template <typename T>
class F {
public:
    F(int(T::*f)(void*,void*))
    {
        this->f = f;
    }

    int(T::*f)(void*,void*);

    int Call(T& t,void* a,void* b)
    {
        return (t.*f)(a,b);
    }
};

A a;
F<A> f(&A::f);
f.Call(a, 0, 0);

好吧,我可以轻松调用该函数,但是在不知道类型的情况下,我如何拥有这些函数的数组?

我希望能够调用任何类 f 函数作为回调。我通常会使用静态或 c 函数并完成它,但我想尝试调用 C++ 成员函数。

想想我作为 C# 中的代表想要做什么。我在 Boost 和其他地方看到了非常复杂的实现,但我想要最低限度的实现,不需要复制、创建、删除等,只需要一个我可以调用的简单回调。

这是白日梦吗?任何建议将不胜感激。

最佳答案

使用std::functionstd::bind正如我在评论中提到的,你可以这样做:

#include <functional>

class A
{
public:
    A() {}

    int f(void*, void*)
    {
        return 0;
    }
};

class F {
public:
    F(std::function<int(void*, void*)>& func)
        : func_(func)
    { }

    std::function<int(void*, void*)>& func_

    int Call(void* a, void* b)
    {
        return func_(a, b);
    }
};

int main()
{
    using namespace std::placeholders; //for _1, _2, _3...

    A a;
    F f(std::bind(&A::f, a, _1, _2));

    f.Call(nullptr, nullptr);
}

要使用这些函数的 vector ,只需使用例如

std::vector<std::function<int(void*, void*)>> my_function_vector;

然后,要调用 vector 中的每个函数,只需对其进行迭代即可:

for (auto& f : my_function_vector)
{
    int result = f(some_pointer_1, some_pointer_2);
}

如果标准库中没有新的 C++11 功能,请使用 boost::bindboost::function同样有效。您可以使用老式的迭代器循环来迭代 vector 。

关于c++ - 如何做一个简单的C++通用回调?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16343353/

相关文章:

c++ - 减少 float 平方和的舍入误差

c++ - 如何在函数内部使用 cin?

javascript - 使用 WebSQL 进行回调 (Phonegap)

javascript - 多次连续调用带有回调的函数会导致回调 hell

c++ - 使用声明可以在 gcc 和 msvc 中编译,但在 clang 中被拒绝

c++ - '*' 之前的预期主表达式?

c++ - 在 C 代码中注册 C++ 回调方法

javascript回调模式使用简单的例子

c++ - "__callback"SAL 注释的作用是什么?

c++ - 在VS2008编译的MFC App中关闭XP Theme