在struct中定义operator()函数

时间:2014-03-18 19:30:59

标签: c++ boost

在函数包装器here上浏览Boost库中的一个教程时,我遇到了以下代码:

  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行中的概念而言。

2 个答案:

答案 0 :(得分:5)

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

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

然而,第10行的括号​​不是该运算符的调用;他们是构造函数调用。所以该行说&#34;使用该类型的默认构造函数创建类型int_div的对象,并将该对象分配到f。&#34;

答案 1 :(得分:3)

如果您使用的是C ++ 11,则可以将第10行写为:

f = int_div{};

这可能有助于你的困惑。 此行创建int_div类型的临时对象,然后将其分配给f

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