传递函数 P>好,我用C++写了很久了。 我从来没有做过这么安静的事

传递函数 P>好,我用C++写了很久了。 我从来没有做过这么安静的事,c++,function,function-pointers,arguments,fltk,C++,Function,Function Pointers,Arguments,Fltk,所以基本上我需要创建一个类。 类的构造函数需要引用(或指针)另一个类的方法或函数 基本上,我有一个类需要偶尔从fltk赋值器(1.1.x版)读取一个值,然后更改一些关于它自己的内容。 每个对象都有自己的与之关联的赋值器。 (它们还有一个指向同一父对象的另一个对象的链接,在更新它们之后,估价者会告诉它们自己要更新,依此类推) 那么如何在构造函数中传递函数呢?下面是一个示例,其中Foo的方法被传递到Bar构造函数,然后在给定的Bar对象上调用: struct Foo { int z;

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

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


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

下面是一个示例,其中
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);
}
另一方面,如果您在
Bar
构造时已经知道
Foo
对象,那么
Bar
并不真正关心该方法属于哪个类。它所需要的只是一个稍后调用的functor,
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();
}
#包括
结构条
{
std::函数f;
条(std::函数f):f(f){}
int call()
{
返回f(4,2);
}
};
使用名称空间std::占位符;
int main()
{
Foo-Foo={123};
条形图(std::bind(&Foo::add,&Foo,_1,_2));
bar.call();
}

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

以下是一个示例,其中
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);
}
另一方面,如果您在
Bar
构造时已经知道
Foo
对象,那么
Bar
并不真正关心该方法属于哪个类。它所需要的只是一个稍后调用的functor,
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();
}
#包括
结构条
{
std::函数f;
条(std::函数f):f(f){}
int call()
{
返回f(4,2);
}
};
使用名称空间std::占位符;
int main()
{
Foo-Foo={123};
条形图(std::bind(&Foo::add,&Foo,_1,_2));
bar.call();
}

如果您没有C++0x编译器,请将
std::bind
替换为
std::tr1::bind
boost::bind
您的构造函数可能如下所示:


// 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\u-fun和mem\u-fun\u-ref。这些函数可以满足您的需要。

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


// 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\u-fun和mem\u-fun\u-ref。这些函数可能会满足您的需要。

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

比如说,

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

将允许您接受任何整数源

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

比如说,

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

将允许您接受任何整数源

您如何知道在哪个对象上调用传递的方法?该对象在构造过程中已知吗,或者稍后要调用它时已知吗?传递的方法不接受任何参数。它只返回一个双精度值,这是赋值器当前设置的值。具有我想要传递的方法的赋值器对象已经创建。查看标准函数mem_fun和mem_fun_ref。这些函数可能正是您想要的。我认为如果您发布一些代码,这将是一个好主意。然后我们可以提供更具体的帮助。对于应该以OO方式解决的问题(从公共根继承类、策略模式或少数其他方式)2,似乎是不自然的过程方式。代码如何知道调用传递的方法的对象?该对象在构造过程中已知吗,或者稍后要调用它时已知吗?传递的方法不接受任何参数。它只返回一个双精度值,这是赋值器当前设置的值。具有我想要传递的方法的赋值器对象已经创建。查看标准函数mem_fun和mem_fun_ref。这些函数可能正是您想要的。我认为如果您发布一些代码,这将是一个好主意。然后我们可以提供更具体的帮助。对于应该以OO方式解决的问题(从公共根继承类、策略模式或少数其他方式)2,似乎是不自然的过程方式。代码实际上它可能不是类的成员。它可能是一个函数,我只创建了一个包装器(比如将度转换为弧度)。@Oxi:“它可能不是”->它实际上不是?或者你想两者都允许吗?实际上它可能不是一个类的成员。它可能是一个函数,我只创建了一个包装器(比如将度转换为弧度)。@Oxi:“它可能不是”->它实际上不是?或者你想两者都允许?这是后一种情况,不幸的是我被GCC 3.42困住了。(devc++),我不想更新,因为这也是我的评估员将要使用的。我想我携带整个对象只是为了访问它的方法。@Oxi:那么
Bar
在编译时知道调用哪个
Foo
方法吗?在这种情况下,您根本不需要函数指针。这是后一种情况,不幸的是,我一直使用GCC 3.42。(devc++),我不想更新,因为这是我的