2

假设我有以下代码:

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 和其他地方看到了非常复杂的实现,但我想要最少的,不需要复制、创建、删除等,只需要一个我可以调用的简单回调。

这是白日梦吗?任何意见,将不胜感激。

4

2 回答 2

4

使用std::functionandstd::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);
}

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

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

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

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

如果您在标准库中没有新的 C++11 功能,那么使用boost::bindboost::function工作也一样。你使用老式的迭代器循环来迭代向量。

于 2013-05-02T16:50:41.620 回答
1

我认为最低限度的实现如下:

std::vector<std::function<bool(int, int)>> my_delegate;

然后,您可以将许多不同类型的可调用项添加到您的向量中。如:

bool mycompare(int a, int b)
{
    return a < b;
}

struct predicate
{
    bool operator()(int a, int b)
    {
        return a < b;
    }
};

struct myclass
{
    bool function(int a, int b)
    {
        return a < b;
    }
};

my_delegate.push_back(predicate());
my_delegate.push_back(mycompare);
my_delegate.push_back([](int a, int b){return a < b;});
myclass c;
my_delegate.push_back(std::bind(std::bind(&myclass::function, &c, std::placeholders::_1, std::placeholders::_2));

调用委托中的所有函数只是循环它们并依次调用每个函数。

于 2013-05-02T16:48:01.517 回答