首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在结构中定义operator()函数

在结构中定义operator()函数
EN

Stack Overflow用户
提问于 2014-03-19 03:30:59
回答 2查看 4.9K关注 0票数 6

在浏览Boost库中关于函数包装器here的教程时,我遇到了以下代码:

代码语言:javascript
运行
复制
  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行的概念发生了什么吗?

EN

回答 2

Stack Overflow用户

发布于 2014-03-19 03:43:23

在C++中,您可以为您的类型提供运算符。由于函数调用(())只是语言中的另一个运算符,因此可以为您的类型定义它。因此,int_div内部的定义说:“int_div类型的对象可以应用函数调用运算符(带有操作数intint);这样的调用将返回一个float。”

boost::function是任何可调用内容的包装器。由于int_div类型的对象可以与函数调用运算符一起使用,因此它是可调用的,因此可以存储在boost::function中。类型也是匹配的-- int_div中的运算符确实是float(int, int)类型。

但是,第10行的括号不是对该操作符的调用;它们是构造函数调用。因此,这行代码是“使用int_div类型的默认构造函数创建该类型的对象,并将该对象分配给f。”

票数 8
EN

Stack Overflow用户

发布于 2014-03-19 04:02:12

如果你使用的是C++11,你可以把第10行写成:

代码语言:javascript
运行
复制
f = int_div{};

这也许能帮你解开困惑。这行代码创建一个int_div类型的临时对象,然后将其分配给f

它不是函数调用,尽管它看起来像一个函数调用。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22489212

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档