Thursday, March 15, 2007

模版分离重载

用Boost::bind可以实现很多匪夷所思的绑定,比如将不同类型的参数绑定到一个函数上。在SAGE的回调函数中,希望能提供一个尽量统一的接口,使得用户可以使用function/member function来作为回调函数,回调函数的参数可以是各种类型,SAGE 将自动从输入流中读取该类型的数据并传回给回调函数。
本来想用function1来包装回调函数,以为可以轻松搞定。结果发现当T=void时,不能定义void类型的变量并作为形参……编译出错
苦思冥想了半天,终于用bind绑定函数,然后将bind的返回对象bind_t进行分离重载,重载成L=boost::_bi::list0和list1两个函数,终于搞定。
然后想用同样的方法bind绑定member function,再分离重载……谁又知member function(void)和function(T)都是L=boost::_bi::list1这样的形式……然后再苦思冥想分离……
最后:
void BindedCall( boost::_bi::bind_t〈R, F, boost::_bi::list0〉 Func ) // function(void), 不读入
void BindedCall( boost::_bi::bind_t〈R, F, boost::_bi::list1〈boost::arg〈1〉〉〉 Func ) // function(T), 读入
void BindedCall( boost::_bi::bind_t〈R, F, boost::_bi::list1〈boost::reference_wrapper〈REFT〉〉〉 Func ) // member function(void), 不读入
void BindedCall( boost::_bi::bind_t〈R, F, boost::_bi::list2〈A1,A2〉〉 Func ) // member function(T),读入
这4种形式
知道这并不好看,将就着吧。

分离的模版具体方法参见 boost::bind 和 boost::bind_t Ref:http://blog.csdn.net/lyskyly/archive/2006/10/28/1354273.aspx

No comments: