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