Function Call operate()
operator是C++的关键字,它和运算符一起使用,表示一个运算符函数,理解时应将operator=整体上视为一个函数名。
这是C++扩展运算符功能的方法,虽然样子古怪,但也可以理解:一方面要使运算符的使用方法与其原来一致,另一方面扩展其功能只能通过函数的方式(c++中,“功能”都是由函数实现的)。
简单的例子
我们首先以一个简单的例子开始。考虑用函数 f 处理 [ n, m ] 之间的数据,最后在求和。
我们首先可以采用函数重载来实现:
class classf{ public: classf() { } double operator() (double x){ return 2*x; } }; double sum2(classf f,int n, int m){ double result=0; for(int i=n;i<=m;i++) result+=f(i); return result;
我们可以这样来调用:
classf cf; cout<<sum2(cf,2,5)<<endl; //or simply cout<<sum2(classf(),2,5)<<endl;
上述功能的实现同样可以不用函数重载:
class classf{ public: classf() { } double run (double x){ return 2*x; } }; double sum3(classf f,int n, int m){ double result=0; for(int i=n;i<=m;i++) result+=f.run(i); return result;
调用:
cout<<sum3(classf2(),2,5)<<endl;
减号在sum函数中的传递
函数指针机制对于内置操作符来说是不够的,我们如何创造一个一元减到sum()?sum( - ,2, 5) 会出现语法错误,C++中定义了一个<functional>函数对象。
首先我们先来看一个斐波那契额数列:(模板编程)
#include <stdio.h> template <int depth> class Fibnacci { public: static const int value = Fibnacci<depth-1>::value + Fibnacci<depth-2>::value; }; template <> class Fibnacci<0> { public: static const int value = 0; }; template <> class Fibnacci<1> { public: static const int value = 1; }; template <int depth> void printFibnacci() { printFibnacci<depth-1>(); wprintf(L"%d\n", Fibnacci<depth>::value); } template <> void printFibnacci<0>() { wprintf(L"%d\n", Fibnacci<0>::value); } int main() { printFibnacci<8>(); return 0; }
对于减号的实现:(参考的资料)
template<class T> struct negate: public unary_function<T,T>{ T operator() (const T& x) const{ return -x; } }; template<class F> double sum(F f,int n,int m){ double result=0; for(int i=n;i<=m;i++) result+=f(i); return result; }
函数的调用可以通过:
sum(negate<double>(),2,5);
https://www.cnblogs.com/winter-cn/archive/2009/09/05/1561094.html