这个文件里,通过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;
}