Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在结构中定义运算符()函数_C++_Boost - Fatal编程技术网

C++ 在结构中定义运算符()函数

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

在阅读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     }
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{};