编辑“︁
C++11
”︁(章节)
跳转到导航
跳转到搜索
脚本错误:没有“Mainspace editnotice”这个模块。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
=== 用于计算函数对象返回类型的统一方法 === 要在編譯期決定一個樣板仿函式的回返值型別並不容易,特別是當回返值依賴於函式的參數時。舉例來說: <syntaxhighlight lang="cpp"> struct Clear { int operator()(int); // 參數與回返值的型別相同 double operator()(double); // 參數與回返值的型別相同 }; template <class Obj> class Calculus { public: template<class Arg> Arg operator()(Arg& a) const { return member(a); } private: Obj member; }; </syntaxhighlight> 實體化樣板類<code>Calculus<nowiki><Clear></nowiki></code>,<code>Calculus</code>的仿函式其回返值總是和<code>Clear</code>的仿函式其回返值具有相同的型別。然而,若給定類別<code>Confused</code>: <syntaxhighlight lang="cpp"> struct Confused { double operator()(int); // 參數與回返值的型別不相同 int operator()(double); // 參數與回返值的型別不相同 }; </syntaxhighlight> 企圖實體化樣板類Calculus<Confused>將導致Calculus的仿函式其回返值和類別Confused的仿函式其回返值有不同的型別。對於<code>int</code>和<code>double</code>之間的轉換,編譯器將給出警告。 模板<code>std::result_of</code>被TR1引進且被C++11所採納,可允許我們決定和使用一個仿函式其回返值的型別。底下,<code>CalculusVer2</code>物件使用<code>std::result_of</code>物件來推導其仿函式的回返值型別: <syntaxhighlight lang="cpp"> template< class Obj > class CalculusVer2 { public: template<class Arg> typename std::result_of<Obj(Arg)>::type operator()(Arg& a) const { return member(a); } private: Obj member; }; </syntaxhighlight> 如此一來,在實體化<code>CalculusVer2<nowiki><Confused></nowiki></code>其仿函式時,不會有型別轉換,警告或是錯誤發生。 模板<code>std::result_of</code>在TR1和C++11有一點不同。TR1的版本允許實作在特殊情況下,可以無法決定一個函式呼叫其回返值型別。然而,因為C++11支持了[[decltype]],實作被要求在所有情況下,皆能計算出回返值型別。
摘要:
请注意,所有对Local Chinese Wikipedia的贡献均可能会被其他贡献者编辑、修改或删除。如果您不希望您的文字作品被随意编辑,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源(详情请见
Project:著作权
)。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)
导航菜单
个人工具
未登录
讨论
贡献
创建账号
登录
命名空间
页面
讨论
大陆简体
不转换
简体
繁體
大陆简体
香港繁體
澳門繁體
大马简体
新加坡简体
臺灣正體
查看
阅读
编辑
查看历史
更多
搜索
导航
首页
最近更改
随机页面
MediaWiki帮助
工具
链入页面
相关更改
特殊页面
页面信息