
#include#include#includeintuse_foo1_1(intn){returnn;}intuse_foo1_2(intn){returnn-1;}intuse_foo2_1(intn,intm){returnn+m;}intuse_foo2_2(intn,intm){returnnm;}voidtest1(void){typedefint(foo_type)(int);//函数类型由函数返回值类型和参数列表类型决定typedefstd::mapfoo_map_type;foo_map_typemap;map["aaa"]=use_foo1_1;map["bbb"]=use_foo1_2;std::cout>foo_map_type;foo_map_typemap;map["aaa"]=std::pair(use_foo1_1,1);map["bbb"]=std::pair(use_foo2_1,2);if(map["aaa"]second==1){std::cout(map["aaa"]first))(10)(map["aaa"]first))(10,20)(map["bbb"]first))(10)(map["bbb"]first))(10,20)#include#include#include#include#includeclassfoo_container{private:classbase_foo_handler//为了能够统一存储使用接口模式做存储规范{public:virtualvoidcall(constboost::any¶ms)const=0;};templateclassfoo_handler:publicbase_foo_handler//带返回值的函数包装{public:typedefHandler_Foofoo_type;typedefHandler_Params_Parse_And_Callparam_parse_and_call_type;typedefHandler_Ret_Backret_back_type;foo_handler(constfoo_type&foo,constparam_parse_and_call_type¶ms_parse,constret_back_type&ret_back):_foo(foo),_params_parse_and_call(params_parse),_ret_back(ret_back){}virtualvoidcall(constboost::any¶ms)const{_params_parse_and_call(_foo,params,_ret_back);}private:foo_type_foo;param_parse_and_call_type_params_parse_and_call;ret_back_type_ret_back;};templateclassfoo_handler:publicbase_foo_handler//不带返回值的函数包装{public:typedefHandler_Foofoo_type;typedefHandler_Params_Parse_And_Callparam_parse_and_call_type;typedefvoidret_back_type;foo_handler(constfoo_type&foo,constparam_parse_and_call_type¶ms_parse):_foo(foo),_params_parse_and_call(params_parse){}virtualvoidcall(constboost::any¶ms)const{_params_parse_and_call(_foo,params);}private:foo_type_foo;param_parse_and_call_type_params_parse_and_call;};templatestructparams_foo_switch//函数执行的规范函数{templatestaticvoids_params_parse_and_call(constHandler_Foo&foo,constboost::any¶ms)//不带返回值//参数有多少个就补充多少组{BOOST_MPL_ASSERT((boost::mpl::bool_));}templatestaticvoids_params_parse_and_call(constHandler_Foo&foo,constboost::any¶ms,constHandler_Ret_Back&ret)//带返回值//参数有多少个就补充多少组{BOOST_MPL_ASSERT((boost::mpl::bool_));//这只是个函数的说明实际用的是特例函数}};templatestructparams_foo_switch//函数执行的规范函数(1参数){templatestaticvoids_params_parse_and_call(constHandler_Foo&foo,constboost::any¶ms){typedefTupletuple_type;consttuple_type&tuple=boost::any_cast(params);foo(boost::get(tuple));}templatestaticvoids_params_parse_and_call(constHandler_Foo&foo,constboost::any¶ms,constHandler_Ret_Back&ret){typedefTupletuple_type;consttuple_type&tuple=boost::any_cast(params);ret(foo(boost::get(tuple)));}};templatestructparams_foo_switch//函数执行的规范函数(2参数){templatestaticvoids_params_parse_and_call(constHandler_Foo&foo,constboost::any¶ms){typedefTupletuple_type;consttuple_type&tuple=boost::any_cast(params);foo(boost::get(tuple),boost::get(tuple));}templatestaticvoids_params_parse_and_call(constHandler_Foo&foo,constboost::any¶ms,constHandler_Ret_Back&ret){typedefTupletuple_type;consttuple_type&tuple=boost::any_cast(params);ret(foo(boost::get(tuple),boost::get(tuple)));}};templatestructparams_foo_switch//函数执行的规范函数(3参数){templatestaticvoids_params_parse_and_call(constHandler_Foo&foo,constboost::any¶ms)//不带返回值{typedefTupletuple_type;consttuple_type&tuple=boost::any_cast(params);foo(boost::get(tuple),boost::get(tuple),boost::get(tuple));}templatestaticvoids_params_parse_and_call(constHandler_Foo&foo,constboost::any¶ms,constHandler_Ret_Back&ret){typedefTupletuple_type;consttuple_type&tuple=boost::any_cast(params);ret(foo(boost::get(tuple),boost::get(tuple),boost::get(tuple)));}};//如要处理4参以上的函数请自己补充,一般20参足够了copypase的体力活typedefboost::shared_ptrfoo_handler_ptr_type;typedefstd::mapmap_type;typedefmap_type::const_iteratormap_citer_type;private:typedeffoo_containerthis_type;public:foo_container(void){}~foo_container(void){}templateboolregister_foo(conststd::string&name,constHandler_Foo&foo){typedefHandler_Foofoo_type;typedefTupletuple_type;returnprv_register_foo(name,foo,boost::bind(¶ms_foo_switch::value>::s_params_parse_and_call,_1,_2));}templateboolregister_foo(conststd::string&name,constHandler_Foo&foo,constHandler_Ret_Back&ret){typedefHandler_Foofoo_type;typedefHandler_Ret_Backret_back_type;typedefTupletuple_type;returnprv_register_foo(name,foo,ret,boost::bind(¶ms_foo_switch::value>::s_params_parse_and_call,_1,_2,_3));}templateboolcall(conststd::string&name,constTuple¶ms)const{map_citer_typeiter=_mapfind(name);if(iter==_mapend()){returnfalse;}iter->second->call(boost::any(params));returntrue;}private:templateboolprv_register_foo(conststd::string&name,constHandler_Foo&foo,constHandler_Params_Parse_And_Callparams){typedeffoo_handlernow_foo_handler_type;foo_handler_ptr_typeptr(newnow_foo_handler_type(foo,params));return_mapinsert(map_type::value_type(name,ptr))second;}templateboolprv_register_foo(conststd::string&name,constHandler_Foo&foo,constHandler_Ret_Back&ret,constHandler_Params_Parse_And_Call¶ms){typedeffoo_handlernow_foo_handler_type;foo_handler_ptr_typeptr(newnow_foo_handler_type(foo,params,ret));return_mapinsert(map_type::value_type(name,ptr))second;}private:map_type_map;};templatevoidback_ret(constT&val){std::cout>("aaa",boost::bind(&use_foo1_1,_1),boost::bind(&(back_ret),_1));contregister_foo>("bbb",boost::bind(&use_foo2_1,_1,_2),boost::bind(&back_ret,_1));contcall("aaa",boost::make_tuple(10));contcall("bbb",boost::make_tuple(10,20));}intmain(intargc,charargv[]){test1();test2();test3();charcc=0;std::cin>>cc;return0;}vc2010下编译运行通过功能扩充弄清楚后你自己添加boost版本153
可以。
在这次项目中需要对MD5来确定一张的唯一性,如果两个MD5相同就认定问两张是同一张图,只不过是被转载的。
对MD5算法简要的叙述可以为:MD5以512位分组来处理输入的信息,且每一分组又被划分为16个32位子分组,经过了一系列的处理后,算法的输出由四个32位分组组成。
如何读取和校验MD5信息
了解了MD5信息以后,下面我们来看一看如何读取并校验文件的MD5信息。这需要一款检测MD5值的专门小软件,这是一款绿色软件,解压缩后运行其中的MD5EXE文件即可。软件的使用非常简单,点击“Open”按钮,选择并打开想要进行校验的文件,稍等片刻后,在MD5一栏中便会显示该文件的MD5值,将该数值同网站公布的数值进行比较即可确定文件是否完整了。点击“Save”按钮可以将读取的MD5保存为一个MD5文件,用记事本打开该文件,可以将MD5值复制出来。
为了验证文件修改后的MD5值是否发生变化,笔者用一个文本文件进行了测试。如图2所示,第一个文件为进行测试的原始文件,第二个文件为进行修改后的文件(不过只是在打开原始文件的基础上加入了一个空格),第三个文件为原始文件的复制文件。从图中可以看出,尽管改动不大,但是两个文件的MD5值却大相径庭,而复制得到的文件则不会发生变化。
以上就是关于c++如何用简易函数直接获取md5值并保存在字符变量中全部的内容,包括:c++如何用简易函数直接获取md5值并保存在字符变量中、md5码可以查询一张图片的来源吗、怎么看一个文件的md5信息等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)