在浏览Boost库中关于函数包装器here的教程时,我遇到了以下代码:
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行的概念发生了什么吗?
发布于 2014-03-19 03:43:23
在C++中,您可以为您的类型提供运算符。由于函数调用(()
)只是语言中的另一个运算符,因此可以为您的类型定义它。因此,int_div
内部的定义说:“int_div
类型的对象可以应用函数调用运算符(带有操作数int
和int
);这样的调用将返回一个float
。”
boost::function
是任何可调用内容的包装器。由于int_div
类型的对象可以与函数调用运算符一起使用,因此它是可调用的,因此可以存储在boost::function
中。类型也是匹配的-- int_div
中的运算符确实是float(int, int)
类型。
但是,第10行的括号不是对该操作符的调用;它们是构造函数调用。因此,这行代码是“使用int_div
类型的默认构造函数创建该类型的对象,并将该对象分配给f
。”
发布于 2014-03-19 04:02:12
如果你使用的是C++11,你可以把第10行写成:
f = int_div{};
这也许能帮你解开困惑。这行代码创建一个int_div
类型的临时对象,然后将其分配给f
。
它不是函数调用,尽管它看起来像一个函数调用。
https://stackoverflow.com/questions/22489212
复制相似问题