最近研究了一下MammothServer,发现里面有一个叫Dispatcher的实现,很有意思。正好自己最近在学习boost::mpl等东东,因此花了几天学习,并把自己的学习心得总结了一下。相信对大多数C++程序员会有帮助。
前言
在编写通讯框架时,经常要处理众多的协议。而处理完协议后,再调用相应的处理函数时,
在C++中,我们一般要使用统一接口。比如Windows消息中的MSG结构等等。
这种统一的处理结构最大的缺点是缺乏有效地类型检测,容易出错。因为,编译器无法对每一个特定消息进行数据合法性检查。
不过利用模板技术,完全可以实现RPC参数的解析以及与C++函数的自动匹配,支持不定长参数。
伪代码
class Dispatcher {
map<string, func> invokers_;
void register_function( const std::string& name, func);
void invoke( void* packet ) {
sequence params = deserialize( packet );
invokers_[ params["name"] ]( params );
}
}
void hello(const std::string& msg ) {
}
void hello2(const std::string& msg , const std::string& from) {
}
Dispatcher.register_function("hello", hello );
Dispatcher.register_function("hello2", hello2 );
准备知识
C++ template
boost::bind
boost::function 仿函数
boost::fusion 处理不同类型参数的sequence
boost::mpl 处理函数参数表的推导
part1 - basic framework
由于用户提供的函数带有不确定个数的参数,因此,在dispatcher内部,需要首先将用户提供的Function转换成为统一参数的仿函数,定义如下:
引用
出于讲解的需要,暂时不支持返回值,且与应用相关的参数被简化为一个void*
typedef boost::function<void(void*)> invoker_function_type;
相应的容器为
typedef std::map<std::string, invoker_function_type> dictionary_type;
注册函数考虑面向对象,因此包含函数Function和类实例Base.
class Dispatcher {
// 实际的invoke函数形式
typedef boost::function<void(void*)> invoker_function_type;
// name -> invoker 表
typedef std::map<std::string, invoker_function_type> dictionary_type;
dictionary_type m_invokers;
public:
template<typename Function, typename Base>
void register_function(std::string const & name, Function f, Base& base) {
m_invokers[name] = ...; //TODO
}
};
part2 - invoker
invoker是整个实现的核心。其中最重要的是对用户调用函数参数的自适应。
// predefinition
template<typename Function
,typename From = typename mpl::advance_c<typename mpl::begin< ft::parameter_types<Function> >::type, 1>::type
,typename To = typename mpl::end< ft::parameter_types<Function> >::type
>
struct Invoker;
// invoker,提取参数,放入sequence,继续调用
template<typename Function
,typename From
,typename To
>
struct Invoker
{
static void apply(Function func) {
typedef typename mpl::deref<From>::type arg_type; // 当前参数类型
typedef typename mpl::next<From>::type next_iter_type; // 下一个参数
typedef Invoker<Function, next_iter_type, To> NextInvoker;
NextInvoker::apply(func);
}
};
// 特化的invoker,结尾
template<typename Function
,typename To
>
struct Invoker<Function,To,To>
{
static void apply(Function func) {
std::cout << "finish";
}
};
template<typename Function>
void trigger(Function func) {
Invoker<Function>::apply( func );
}
不准确,但是直观的的描述可以理解为:
如果 函数为 func( int, char,void*),则实际生成的模板类分别是
Invoker< Function, int , void >;
Invoker< Function, char, void >;
Invoker< Function, void*, void >;
Invoker< Function, void, void >; //* 这个会匹配到特化的Invoker,从而结束递归
加入收集参数的模板参数
// invoker,提取参数,放入sequence,继续调用
template<typename Function
,typename From
,typename To
>
struct Invoker
{
template< typename Args >
static void apply(Function func, Args args) {
typedef typename mpl::deref<From>::type arg_type; // 当前参数类型
typedef typename mpl::next<From>::type next_iter_type; // 下一个参数
typedef Invoker<Function, next_iter_type, To> NextInvoker;
NextInvoker::apply(func, fusion::push_back(args,std::string("hello")));
}
};
// 特化的invoker,结尾
template<typename Function
,typename To
>
struct Invoker<Function,To,To>
{
template< typename Args >
static void apply(Function func,Args args) {
std::cout << args;
fusion::invoke(func, fusion::push_front(args, input)); // 完成对用户函数的调用
}
};
template<typename Function>
void trigger(Function func) {
Invoker<Function>::apply( func , fusion::nil() );
}
进一步实现对参数的提取,就可以实现一个完整的RPC的机制。
分享到:
相关推荐
1.基于OpenCv的旋转匹配 基于OpenCv实现了模板图像的旋转匹配,此代码基于matchTemplate函数...2.带旋转的模板匹配的原理及算法实现(c++) 带旋转的模板匹配算法,能够匹配带旋转角度的模板。(VS 2015+OPENCV C++)
基于c++实现图像的模板匹配,并将结果显示出来
模板匹配,可将目标图片中与模板图片相似的部分寻找出来。具体原理是求目标图片的每个大小与模板图片相等的部分与模板图片的像素信息的关联度。达到用户规定阈值即可认定为识别成功,并且将最匹配的部分用矩形标记。
带旋转的模板匹配算法,能够匹配带旋转角度的模板。VS 2015+OPENCV C++实现
C++模板特化匹配规则
利用C++,实现了在图片中搜索模板中的部分,并进行检测匹配
一个很好用的C++图像模板匹配算法。经过验证,确实可用!
c++文件模板 c++文件模板 c++文件模板 c++文件模板 c++文件模板 c++文件模板 c++文件模板 c++文件模板 c++文件模板 c++文件模板 c++文件模板 c++文件模板 c++文件模板 c++文件模板 c++文件模板 c++文件模板 c++文件...
在网上找了好久都没找到基于opencv的金字塔模板匹配算法代码,我就自己把金字塔和模板匹配的代码结合了一下,代码基于opencv2.48.
可以实现金字塔加速处理模板匹配,vs2015+opencv3.30.
使用c++和opencv实现的基于相关匹配的模板匹配
c++括号匹配问题c++括号匹配问题c++括号匹配问题c++括号匹配问题c++括号匹配问题c++括号匹配问题c++括号匹配问题c++括号匹配问题
C++模板类型题型,更全面,也可以更从中了解模板的运用与技术。
C++模板与STL库介绍 非常详细
C++模板元编程,ISBN:9787111267423,作者:(美)大卫 等著,荣耀 译 原作名: C++ Template Metaprogramming: Concepts, Tools, and Techniques from Boost and Beyond 出版年: 2010-1 页数: 277
本书是c++模板编程的完全指南,旨在通过基本概念,常用技巧和使用实例3方面的有用资料,为读者打下c++模板坚实的基础
C++模板元编程.pdf 个人收集电子书,仅用学习使用,不可用于商业用途,如有版权问题,请联系删除!
VC++ 结合Opencv 实现模板的匹配,可以用于目标的识别也可实现目标的跟踪
基于QT+Opencv模板匹配支持(缩放、旋转)