C++11 理解 (二十八) 之 用于计算函数对象返回类型的统一方法
2013-08-26 16:53
477 查看
要在编译期决定一个样板仿函数的回返值类别并不容易,特别是当返回值依赖于函数的参数时。举例来说:
实体化样板类
企图实体化样板类 Calculus<Confused> 将导致 Calculus 的仿函数其回返值和类型 Confused 的仿函数其回返值有不同的类别。对于
模板
如此一来,在实体化
模板
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; };
实体化样板类
Calculus<Clear>,
Calculus的仿函数其回返值总是和
Clear的仿函数其回返值具有相同的类别。然而,若给定类型
Confused:
struct Confused { double operator()(int); // 參數與回返值的型別不相同 int operator()(double); // 參數與回返值的型別不相同 };
企图实体化样板类 Calculus<Confused> 将导致 Calculus 的仿函数其回返值和类型 Confused 的仿函数其回返值有不同的类别。对于
int和
double之间的转换,编译器将给出警告。
模板
std::result_of被TR1 引进且被 C++11 所采纳,可允许我们决定和使用一个仿函数其回返值的类别。底下,
CalculusVer2对象使用
std::result_of对象来推导其仿函数的回返值类别:
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; };
如此一来,在实体化
CalculusVer2<Confused>其仿函数时,不会有类别转换,警告或是错误发生。
模板
std::result_of在 TR1 和 C++11 有一点不同。TR1 的版本允许实现在特殊情况下,可以无法决定一个函数调用其回返值类别。然而,因为 C++11支持了decltype,实现被要求在所有情况下,皆能计算出回返值类别。
相关文章推荐
- C++11用于计算函数对象返回类型的统一方法
- Object.assign() 方法用于将所有可枚举的属性的值从一个或多个源对象复制到目标对象。它将返回目标对象。
- 用面向对象思维理解.NET委托:函数是对象、委托是函数对象的类型
- C++11 理解 (二十六) 之 多态函数对象包装器
- 用类名做方法的返回值类型 在学习Java的初始阶段,很多同学使用基本数据类型定义变量和引用类型定义变量以及使用类名做方法的返回值类型常常不知所以。今天我以自己的解读方式和个人的理解作一个简单的解释,和
- isArray()函数(JavaScript中对象类型判断的几种方法)
- 关于函数的返回值是一个接口类型的对象
- jquery中ajax如何返回值到上层函数的方法以及对于js处理json对象方法的记录
- 用面向对象思维理解.NET委托:函数是对象、委托是函数对象的类型
- isArray()函数(JavaScript中对象类型判断的几种方法)
- isArray()函数(JavaScript中对象类型判断的几种方法)
- isArray()函数(JavaScript中对象类型判断的几种方法)
- 8.9 编写函数打开文件用于输入,将文件内容读入 string 类型的 vector 容器,每一行存储为该容器对象 的一个元素。8.10 重写上面的程序,把文件中的每个单词存储为 容器的一个元素
- js valueOf()函数用于返回指定对象的原始值
- 对c++中模板函数函数类型或者函数对象了类型显式指定的理解
- 理解OpenCV中的宏定义 CVAPI(函数返回类型)(转载)
- 对引用和指针使用以及函数返回引用和指针类型的理解
- C++11 理解 (十九) 之 使用或禁用对象的默认函数
- Python学习笔记:python3中的range()函数的返回对象类型
- typeid用于返回指针或引用所指对象的实际类型。