【问题标题】:Binding member functions绑定成员函数
【发布时间】:2011-05-28 09:38:59
【问题描述】:

在成员函数部分的示例中:Member functions 我们得到了一个结构体 X:

struct X {
  int foo(int);
};

首选语法

boost::function<int (X*, int)> f;

f = &X::foo;

X x;
f(&x, 5);

可移植语法

boost::function2<int, X*, int> f;

f = &X::foo;

X x;
f(&x, 5);

我的问题是:

  • 当我的 int foo(int) 只接受一个参数时,为什么我必须添加一个额外的 X* 参数?还有,是不是和使用boost::bind一样,比如:

Person *person = new Person("Tu", 23);

boost::function newFunc2 = boost::bind(&Person::printInfo,person);

  • prefer 语法和可移植语法之间有什么区别以及何时使用其中一种而不是另一种?
  • 什么是函数对象?是函数指针吗?

【问题讨论】:

    标签: c++ boost function-pointers


    【解决方案1】:
    1. 任何成员函数都有一个指向要操作的对象的指针,隐式设置为其第一个参数。当你有这样的代码时:X x; x.foo(10); 编译器可能真的会为你调用foo(&amp;x, 10)(请参阅here 了解两种可能的处理方式) - 显然,名称foo 会以某种方式被破坏。

    2. 有关语法的说明,请参阅Boost documentation。以下是页面中最相关的摘录。基本上,如果您的编译器支持,您应该使用首选版本,因为它最接近函数指针的正常定义(可读性)并且使用更少的模板参数(更快的编译时间)。

      Boost.Function 有两种语法形式:首选形式和可移植形式。首选形式更符合 C++ 语言,减少了需要考虑的单独模板参数的数量,通常提高了可读性;但是,由于编译器错误,并非所有平台都支持首选形式。兼容形式适用于 Boost.Function 支持的所有编译器。请参阅下表以确定编译器使用哪种语法形式。

    3. 函数指针 是一个普通的旧指针,它恰好接受具有特定返回类型和参数列表的函数。 函数对象是定义了 operator() 的任何类型 - 允许将其作为函数调用。

    【讨论】:

    • 1.取决于编译器,Visual C++ 在寄存器ecx iirc 中传递this
    • @Xeo,好电话,我不知道 - 我已经更新了答案,并链接到了维基百科中的提及。
    【解决方案2】:
    1. 您需要传递 X 类型的对象,因为这是一个成员函数指针。您需要一个调用该成员函数的对象。

    2. 可移植语法适用于较旧和较新的编译器,首选语法无法在较旧的编译器上编译。详细区别在functor tutorial page

    3. 有解释
    4. 函数对象是可以作为函数调用的对象。可以是函数指针,也可以是成员函数指针

    【讨论】:

    • @Xeo 我不确定你的意思。这个链接:boost.org/doc/libs/1_41_0/doc/html/function/tutorial.html解释了区别,这就是我的理解
    • 首选语法适用于那些支持它的编译器,可移植是,嗯,可移植并在更多编译器(几乎所有)上受支持。这些话的真正含义应该解释它。 Preferred 之所以这样命名,是因为我们希望在任何地方都使用它,但不能,而且可移植性可用于各种编译器。您的链接甚至在表格中显示!
    猜你喜欢
    • 1970-01-01
    • 2015-12-08
    • 2012-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-11
    • 1970-01-01
    相关资源
    最近更新 更多