2014-03-18 61 views
1

,同时通过对功能封装在Boost库的教程之一(http://www.boost.org/doc/libs/1_55_0/doc/html/function/tutorial.html)去我碰到下面的代码来:定义运算符()函数

1  boost::function<float (int x, int y)> f; 
    2 
    3  struct int_div { 
    4   float operator() (int x, int y) const { return ((float)x)/y; } 
    5  }; 
    6 
    7 
    8  int main() 
    9  { 
10   f = int_div(); 
11   cout << f(5, 3) << endl; 
12   return 0; 
13  } 

我想绕到我的头关于在结构中定义函数(operator()),然后将结构(使用())分配给函数包装器f。有人可以帮助我了解发生了什么,至于概念,在第3-5行和第10行。

谢谢, 艾哈迈德。

+1

这是一个仿函数。 'boost :: function'包含一个可调用的对象,并给它一个可以“调用”的类的实例。 – chris

+1

首先要认识到的是,在C++中,结构和类之间的唯一区别是成员的默认可见性:对于结构而言它是公共的,对于类是私有的。所以你真的在这里定义一个非常公开的课程。 –

回答

3

在C++中,您可以为您的类型提供运算符。由于函数调用(())只是该语言中的另一个运算符,因此可以为您的类型定义它。因此,int_div中的定义表示“int_div类型的对象可以应用函数调用操作符(操作数为intint);此类调用将返回float。”

boost::function是围绕任何可调用的包装。由于int_div类型的对象可以与函数调用操作符一起使用,因此它可以被调用,因此可以存储在boost::function中。类型也匹配 - int_div中的运算符的确属于float(int, int)类型。

然而,第10行的括号​​不是该调用者的调用;他们是一个构造函数调用。所以该行说:“使用该类型的默认构造函数创建类型为int_div的对象,并将该对象分配到f。”

3

如果您正在使用C++ 11,你可以写线#10:

f = int_div{}; 

这可能与你的困惑帮助。 该行创建一个类型为int_div的临时对象,然后将其分配给f

这不是一个函数调用,即使它看起来像一个。