在阅读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行。
在c++中,您可以为您的类型提供操作符。由于函数调用(()
)只是语言中的另一个操作符,因此可以为您的类型定义它。因此,int_div
内部的定义说:"int_div
类型的对象可以对其应用函数调用操作符(操作数为int
和int
);这样的调用将返回一个float
。"
boost::function
是任何可调用的包装器。由于int_div
类型的对象可以与函数调用操作符一起使用,因此它是可调用的,因此可以存储在boost::function
中。类型也匹配——int_div
中的操作符确实是float(int, int)
类型的。
int_div
的对象,并将该对象赋值给f
。"
如果您使用的是c++ 11,您可以将第#10行写成:
f = int_div{};
,这可能有助于你的困惑。这一行创建了一个int_div
类型的临时对象,然后将其赋值给f
。
这不是一个函数调用,尽管它看起来像一个。