lamda用法和函数对象,回调函数 部分用法对比

 

lamda用法和函数对象,回调函数  部分用法对比

 

#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <stdexcept>
#include <deque>
#include <Windows.h>
#include <algorithm>
#include <functional>
using namespace std;

//////////////////////////////////////////////////////////////////////////

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;
}

//////////////////////////////////////////////////////////////////////////
void funcasdf(std::function<void(int, int)> a)
{
a(1,2);
}

int main()
{
int a = 1; int b  = 2;

funcasdf( [&a, &b](int c, int as)->void{cout << c << endl; cout << as << endl; ++a;} );
cout << a << endl;

    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;
}

 

posted @ 2013-11-15 16:32  calabashdad  阅读(481)  评论(0编辑  收藏  举报