C++中模拟反射填充消息struct(2)


这个文件里,通过boost::preprocess重复include这个文件8次,从而获得1个到8个成员的fill实现。并通过集成把这个实现模板提供的功能暴露出来,同时收敛其模板参数。

至此,我们得到了一个可以根据FieldList(成员属性的mpl::list),自动match和填充C++结构的fill方法。


使用
好了,我们来写一段代码,测试一下上述实现吧:


struct SimpleObject{   

bool            b; 

std::string    s;       

}; 

typedef boost::mpl::list< 

auto_field<bool,    SimpleObject,  &SimpleObject::b>, 

auto_field<std::string,  SimpleObject,  &SimpleObject::s> 

> SimpleObjectFields; 

int _tmain(int argc, _TCHAR* argv[]) 

SimpleObject so; 

const std::string remote_node_name("testnode@127.0.0.1"); 

const std::string to_name("reflect_msg"); 

tinch_pp::node_ptr my_node = tinch_pp::node::create("my_test_node@127.0.0.1", "abcdef"); 

tinch_pp::mailbox_ptr mbox = my_node->create_mailbox(); 

mbox->send(to_name, remote_node_name, tinch_pp::erl::make_e_tuple(tinch_pp::erl::atom("echo"), tinch_pp::erl::pid(mbox->self()), tinch_pp::erl::make_e_tuple( 

tinch_pp::erl::make_atom("false"), 

tinch_pp::erl::make_string("hello c++") 

))); 

const tinch_pp::matchable_ptr reply = mbox->receive(); 

bool ret = fill<SimpleObjectFields>::fill_on_match(&so,reply); 

printf("ret is %s \n",(ret?"true":"false")); 

printf("so.b == %s \n",(so.b?"true":"false")); 

printf("so.s == %s \n",so.s.c_str()); 

system("pause"); 

return 0; 

}

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/3a27760c9affe1dd2660f90f2d3e0020.html