传递功能

时间:2010-09-24 07:19:22

标签: c++ function function-pointers arguments fltk

好吧,自从我用C ++编写以来已经有一段时间了。 我从来没有做过这么高级别的任何事情。

所以基本上我需要创建一个类。 该类的构造函数需要从另一个类或函数中获取方法的引用(或指针)。

基本上我有一个类需要有时从fltk评估器(版本1.1.x)读取一个值,然后更改一些关于它自己的东西。 每个对象都有自己的与之关联的评估器。 (它们还有一个指向同一父对象的另一个对象的链接,在从评估者更新它们后会告诉更新,等等)

那么如何在构造函数中传递函数?

3 个答案:

答案 0 :(得分:3)

以下示例将Foo的方法传递给Bar构造函数,然后在给定的Bar对象上调用:

struct Foo
{
    int z;

    int add(int x, int y)
    {
        return x + y + z;
    }

    int mul(int x, int y)
    {
        return x * y * z;
    }
};

typedef int (Foo::*foo_method)(int, int);

struct Bar
{
    foo_method m;

    Bar(foo_method m) : m(m) {}

    int call_on(Foo* foo)
    {
        return (foo->*m)(4, 2);
    }
};

int main()
{
    Bar bar(&Foo::add);

    Foo foo = { 123 };
    bar.call_on(&foo);
}

另一方面,如果您在Foo构建时已经知道Bar对象,那么Bar并不关心该方法属于哪个类。它所需要的只是一个稍后调用的函子,Foo对象可以简单地被客户端绑定。

#include <functional>

struct Bar
{
    std::function<int (int, int)> f;

    Bar(std::function<int (int, int)> f) : f(f) {}

    int call()
    {
        return f(4, 2);
    }
};

using namespace std::placeholders;

int main()
{
    Foo foo = { 123 };
    Bar bar(std::bind(&Foo::add, &foo, _1, _2));

    bar.call();
}

如果您没有C ++ 0x编译器,请将std::bind替换为std::tr1::bindboost::bind

答案 1 :(得分:1)

您的构造函数可能如下所示:


// convenient typedef. This is for a pointer to a function in Foo
// The function returns void and takes no parameters.
typedef void (Foo::*FooPtr)();

class Bar {
public:
   Bar (FooPtr foo_ptr);
};

查看一些Web引用,了解有关指向成员的语法的更多详细信息。如果你先熟悉它,那就容易多了。

作为附加说明,请查看函数mem_fun和mem_fun_ref。这些可能会做你需要的。

答案 2 :(得分:1)

捕获此内容的最简单方法是使用boost::function。它可以存储函数指针,也可以存储将成员函数绑定到对象的结果。

例如,

class Foo {
  Foo(boost::function<int(void)>);
};

允许您接受任何整数来源。