重载运算与类型转换
可调用对象与function
c++中有几种可调用对象:函数、函数指针、lambda表达式以及重载了函数调用运算符的类。和其他对象一样,可调用的对象也有类型。然而,两个不同类型的可调用对象可能共享同一种调用类型。例如 int(int,int)是一个函数类型,其接受两个int,return 一个int。
对于几个可调用对象共享同一种调用形式的情况,我们会希望把它们看成具有相同的类型。例如,考虑以下几个不同类型的可调用对象:
// 普通函数 int add(int i, int j) { return i + j; } // lambda, 产生一个未命名的函数对象类 auto mod = [](int i, int j) { return i % j;}; // 函数对象类 struct divide { int operator() (int deno, int divi) { return deno / divi; } }
上述对象共享int(int, int)类的调用形式。我们希望有一个函数表,这个函数表为一个map, key为表示运算符的string, value为对应的函数指针,如下所示:
map<string, int(*)(int, int)> binops;
类型转换运算符
类型转换运算符是一类特殊的成员函数,其形式如下所示:
// 类型转换函数 operator type() const; // e.g 转换为int operator int() const;
为了防止隐式的类型转换,c++11引入了显式的类型转换运算符,如下:
explicit operator int() const {return val;}
SmallInt si = 3; // right
si + 3; //wrong need隐式的转换
static_cast<int>(si) + 3; // right 显示地请求类型转换
有一个例外情况,在这个情况下显式的类型转换会隐示的使用。这个情况为 表达式用作条件时。