在这里通过函数包装器浏览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 }
Run Code Online (Sandbox Code Playgroud)
我试图围绕operator()在struct中定义一个function(),然后将struct(using ())分配给函数包装器f.在第3-5和第10行中,有人可以帮助我了解正在发生的事情.
在C++中,您可以为类型提供运算符.由于函数call(())只是该语言中的另一个运算符,因此可以为您的类型定义它.所以内部的定义int_div说"类型的对象int_div可以将函数调用运算符应用于它们(带有操作数int和int);这样的调用将返回一个float."
boost::function是任何可调用的包装器.由于类型的对象int_div可以与函数调用操作符一起使用,因此它是可调用的,因此可以存储在boost::function.类型也匹配 - 运算符int_div确实是类型float(int, int).
但是,第10行的括号不是该运算符的调用; 他们是构造函数调用.所以该行说" int_div使用该类型的默认构造函数创建一个类型的对象,并将该对象分配给f."
如果您使用的是 C++11,则可以将第 10 行写为:
f = int_div{};
Run Code Online (Sandbox Code Playgroud)
这可能有助于解决您的困惑。此行创建一个类型为 的临时对象int_div,然后将其分配给f。
它不是函数调用,尽管它看起来像函数调用。
| 归档时间: |
|
| 查看次数: |
2936 次 |
| 最近记录: |