仿函数与回调函数

    在之前聊了小括号重载回调函数,现在来聊聊仿函数,以及它和回调函数的关系。

    仿函数是对象使用行为看上去像个函数。

    函数的使用是这个样的
    Function(param1,param2,...)
    而对象的使用是这个样的
    Object.memberfunction(param1,param2...)
    而仿函数对象的使用是这个样的
    Object(param1,param2,...)
    这样我们可以看出,从外表上看,仿函数对象和函数是一个东西。呵呵,当然他们是不同的。他们一样不过是在使用的外形上一样罢了。

#include <iostream>
using namespace std;
#include <string>

//

enum Conversion_Ch
{
    UPPER = 0,   //大写
    LOWER,       //小写
};

/*
** 仿函数
*/
class CFunctor
{
public:
    CFunctor( int conversion );

public:
    /*
    ** 重载小括号
    ** 实现仿函数的核心
    */
    char operator() ( char ch ) const;

private:
    int m_nConversion;
};

CFunctor::CFunctor( int conversion )
    : m_nConversion(conversion)
{

}

char CFunctor::operator() ( char ch ) const
{
    switch ( m_nConversion )
    {
    case UPPER:
        {
            return ch & 0x5F;
        }
        break;
    case LOWER:
        {
            return ch | 0x20;
        }
        break;
    default:
        break;
    }

    return ch;
}

//

/*
** 转换函数
** 利用仿函数实现
*/
void ConversionFun( const string & str, const CFunctor & functor )
{
    for ( int i = 0; i < (int)str.length(); ++i )
    {
        char ch = str[i];
        cout << functor( ch );
    }

    return;
}

//

typedef char (*pFun)( char ch );

char UpperFun( char ch )
{
    return ch & 0x5F;
}

char LowerFun( char ch )
{
    return ch | 0x20;
}

/*
** 转换函数
** 利用回调函数实现
*/
void ConversionFun( const string & str, const pFun functor )
{
    /* 
    ** 注意实现代码,跟仿函数的一摸一样
    ** 仿函数名称也是来源于此
    */
    for ( int i = 0; i < (int)str.length(); ++i )
    {
        char ch = str[i];
        cout << functor( ch );
    }

    return;
}

//

int main()
{
    string str1 = "AbCdEfGhIjKlMn";

    // 利用仿函数,将str1转换为大写字符串
    ConversionFun( str1, CFunctor(UPPER) );
    cout<< endl;

    // 利用仿函数,将str1转换为小写字符串
    ConversionFun( str1, CFunctor(LOWER) );
    cout<< endl;

    // 利用回调函数,将str1转换为大写字符串
    ConversionFun( str1, UpperFun );
    cout<< endl;

    // 利用回调函数,将str1转换为小写字符串
    ConversionFun( str1, LowerFun );
    cout<< endl;

    return 0;
}

 

参考资料

1.http://www.cppblog.com/walkspeed/archive/2008/11/21/4510.html

2.http://www.cnitblog.com/jackrain/archive/2005/10/10/3207.html(蛮有用的一个方法)

3.http://hi.baidu.com/laodun/blog/item/ffcc8f82e2108694f603a696.html

4.http://hi.baidu.com/ruo0ruo/blog/item/19525bca54d4f314bf09e653.html

转载于:https://www.cnblogs.com/c007136/archive/2012/05/28/2522528.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值