2011-05-28 35 views
1

在成员函数部分的示例: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); 

我的问题是:

  • 为什么我必须把额外的X *参数时,我INT FOO(INT)只有一个参数?另外,是一样使用boost ::绑定,如:

人*人=新的Person( “涂”,23);

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

  • 有什么喜欢的语法和便携式语法以及何时使用一个比另一个区别?
  • 什么是函数对象?那是函数指针吗?

回答

2
  1. 任何成员函数有一个指针指向该对象隐式设置作为第一个参数进行操作。当你有这样的代码:X x; x.foo(10);编译器可能真的为你打电话foo(&x, 10)(看到here有两种方式可以处理) - 显然,foo这个名字会以某种方式被损坏。

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

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

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

+0

1.取决于编译器,Visual C++在寄存器'ecx' iirc中传递'this'。 – Xeo 2011-05-28 12:07:32

+0

@Xeo,很好的电话,我不知道 - 我已经更新了答案,并且链接到维基百科中提到它。 – Node 2011-05-28 12:16:51

2
  1. 您必须通过X型的对象,因为这是一个成员函数指针。你需要一个你调用该成员函数的对象。

  2. 可移植语法适用于较旧和较新的编译器,并且优先语法不能在较早的编译器上编译。细节差异在functor tutorial page

  3. 中解释函数对象是您可以作为函数调用的对象。它可以是函数指针或成员函数指针

+1

我认为你混合了首选和便携式... – Xeo 2011-05-28 12:06:43

+0

@Xeo我不知道你的意思。此链接:http://www.boost.org/doc/libs/1_41_0/doc/html/function/tutorial.html解释了这种差异,这就是我的理解 – 2011-05-28 16:19:29

+1

首选语法适用于那些支持它的编译器,便携式很好,可移植并且在更多编译器(几乎所有)上得到支持。这些词的含义应该解释它。首选是这样命名的,因为我们希望在任何地方都使用它,但不能,而且便携式可用于大量编译器。甚至可以链接到表格中! – Xeo 2011-05-28 16:25:27