gpt4 book ai didi

c++ - 如何做一个简单的 C++ 泛型回调?

转载 作者:搜寻专家 更新时间:2023-10-31 00:39:20 28 4
gpt4 key购买 nike

假设我有以下代码:

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# 中作为委托(delegate)尝试做的事情。我在 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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com