[C++之AOP]Aspect C++生成远程调用代码可能性探讨

C++ 0x keynote(以下简称0x)中描述了这样一个看起来不错的东西:

1、本地调用代码:
X x 
A a 
stdstring sxfa s 
2、使用远程代理wrapper层:
proxyX x 
xconnect 
A a 
stdstring sxfa s 


仅使用一个包装层就完成远程调用?从目前的C++来看基本上不可能。 今天突然想到可以使用aspect c++来生成代码,因为aspect c++在生成代码时,也生成了一些简单的元信息,可以在函数里面取得函数的原型、各参数的类型等。 根据0x的描述,我编写了简单的测试代码:

 std LoginService login string name string password string session logout string session RemoteCall connect host port
		cout endl send p size_t len
		cout endl
		cout stringp len endl recv p size_t len RemoteLoginService LoginService RemoteCall login string name string password string session logout string session argcargv
	RemoteLoginService rls
	rlsconnect
	string session
	rlslogin session
	rlslogoutsession

现在的目标是加入一个方面,让RemoteLoginService具有远程调用功能。当然由于此处RemoteCall并未实现,所以只要能够把这个调用正确序列化就算完成目标。 这个方面完成后如下:
aspect Remote
	pointcut remote_class
	pointcut remote_call derivedremote_classremote_class

	pointcut virtual_methods

	advice withinremote_call executionvirtual_methods before
		stringstream ss
		ss JoinPointsignature endl
		sssize_t i iJoinPointargsi
			string argtjpargtypeiargfind argnpos
				ssstringtjpargi
		string send_str ssstr
		tjptargetsendsend_strc_str send_strsize

	advice withinremote_call executionvirtual_methods after
		vector buffer
		tjptargetrecvbufferbegin buffersize

它匹配所有从RemoteCall上派生的类,为它的每个方法加入远程调用代码以及调用结果处理代码。 生成并编译运行,输出如下:
connect success
send:
        call:bool RemoteLoginService::login(const ::std::basic_string< char > &,const ::std::basic_string< char > &,::std::basic_string< char > &)
        arguments:lijie|lijie||
send:
        call:void RemoteLoginService::logout(const ::std::basic_string< char > &)
        arguments:|

由于完整序列化了各个参数值,第一个目标——生成远程调用代码——算是完成了。

下一个目标,考虑服务端如何编写?服务端需要开启一个服务,并注册各个服务接口。

要达到这个目标,aspect c++需要提供类、方法级别的类型及名称获取,不过aspect c++在这方面没有提供更多方便,现在只能在方法执行时获得方法的信息,它所生成的“元信息”过于简单,而且为了效率考虑都实现为各个独立的结构,结构的成员也大都是static的,所以无法使用一个合适的接口来反射,期待以后能加入这些特性。

所以这第2个目标实际上无法简单地完成,除非在服务端手工添加服务注册代码,这个部分工作量稍小,但还是可以做到的。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值