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

posted @ 2021-01-14 14:37  为红颜  阅读(132)  评论(0编辑  收藏  举报