C++ 在结构中定义运算符()函数
在阅读Boost库中关于函数包装器的一个教程时,我遇到了以下代码:C++ 在结构中定义运算符()函数,c++,boost,C++,Boost,在阅读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
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 }
1 boost::函数f;
2.
3结构内部分区{
4浮点运算符()(intx,inty)常量{return((float)x)/y;}
5 };
6.
7.
8 int main()
9 {
10 f=int_div();
在C++中,11个CUT,你可以为你的类型提供操作符。函数调用(<代码>()>代码>)是语言中的另一个操作符,可以为你的类型定义它。所以,在代码< ItNoDIV内定义:“类型<代码> ItNoDIV<代码>的对象可以将函数调用运算符应用到它们。(使用操作数
int
和int
);这样的调用将返回一个float
boost::function
是任何可调用对象的包装。由于类型为int\u div
的对象可以与函数调用操作符一起使用,因此它是可调用的,可以存储在boost::function
中。类型也匹配-int\u div
中的操作符确实是float(int,int)
类型
但是,第10行的括号不是此运算符的调用;它们是构造函数调用。因此,该行表示“使用该类型的默认构造函数创建类型为int\u div
的对象,并将该对象分配到f
”如果使用C++11,则可以将第10行写成:
这可能有助于消除你的困惑。
此行创建类型为int\u div
的临时对象,然后将其分配给f
它不是一个函数调用,即使它看起来像一个。它是一个函子。boost::function
持有一个可调用的对象,你给它一个类的实例,你可以“调用”首先要认识到,在C++中,结构和类之间唯一的区别是成员的默认可见性:对于结构来说它是公共的,对于类来说它是私有的。所以,实际上,这里定义的是一个非常公开的类。
f = int_div{};