在结构体中定义operator()函数

8

在学习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行),请问有人能帮我理解这些概念吗?


1
这是一个函数对象。boost::function 持有一个可调用的对象,你可以给它一个类的实例,然后你就可以“调用”它。 - chris
1
首先要认识到的是,在C++中,结构体和类之间唯一的区别就是成员的默认可见性:对于结构体来说,它是公共的,而对于类来说,它是私有的。因此,你实际上正在定义一个非常公共的类。 - Mark Ransom
2个回答

10

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

boost::function是对任何可调用对象的封装。由于int_div类型的对象可以使用函数调用操作符,因此它是可调用的,并且可以存储在boost::function中。类型也匹配-int_div中的操作符确实是float(int,int)类型。

然而,第10行的括号不是对该操作符的调用,它们是一个构造函数的调用。因此,该行代码表示“使用该类型的默认构造函数创建一个int_div类型的对象,并将该对象分配到f中。”


非常好的答案!谢谢。但是为什么要使用 boost::function?我认为只需要 int_div f; 而不是 f = int_div(); 就可以很好地工作了。为什么要使用 f = int_div();,它有什么优势吗?另外,f = int_div(); 怎么能起作用呢?boost::function 重载了赋值 (=) 运算符吗?哎呀,问题太多了 :) - starriet

6

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

f = int_div{};

这可能有助于您的困惑。

此行代码创建了一个类型为int_div的临时对象,并将其赋值给f

尽管它看起来像函数调用,但它并不是。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接