假设我有以下代码:
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::function
和 std::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::bind
和 boost::function
同样有效。您可以使用老式的迭代器循环来迭代 vector 。
关于c++ - 如何做一个简单的C++通用回调?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16343353/