在函数包装器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行中的概念而言。
答案 0 :(得分:5)
在C ++中,您可以为类型提供运算符。由于函数调用(()
)只是该语言中的另一个运算符,因此可以为您的类型定义它。因此int_div
中的定义表示&#34;类型为int_div
的对象可以将函数调用运算符应用于它们(使用操作数int
和int
);此类通话将返回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
。
它不是函数调用,即使它看起来像一个。