function object研究
4802 点击·0 回帖
![]() | ![]() | |
![]() | 东西太多,有必要停下来仔细看一下几个基本的模板类,这里先看一下add_value_*模板。 template< class T, int I > struct add_value_2 { typedef boost::arg<I> type; }; template< class T > struct add_value_2< T, 0 > { typedef _bi::value< T > type; }; template<class T> struct add_value { typedef typename add_value_2< T, boost::is_placeholder< T >::value >::type type; }; 这是个模板特化应用。当传递boost::arg<N>的时候,会通过boost::is_placeholder<T>::value获取N的值。is_placeholder前面介绍了,就是判断T是否是boost::arg<N>类型,如果是value为1,否则为0. 当为0的时候,编译器则找到add_value_2<T, 0>模板,这里用到了_bi::value<T>模板,看一下定义: template<class T> class value { public: value(T const ; t): t_(t) {} T ; get() { return t_; } T const ; get() const { return t_; } bool operator==(value const ; rhs) const { return t_ == rhs.t_; } private: T t_; }; 这个模板很简单,我们经常写的。把T类型的参数保存为成员变量,提供get方法获取该变量。也提供了拷贝赋值函数。 因此在为0的情况下,type类型就是_bi::value<T>. 否则使用第一个add_value_2模板,这时候类型add_value_2::type就是boost::arg<N> 总结: add_value模板的功能是接受boost::arg<N>类型作为T模板参数,add_value::type就是boost::arg<N>。 如果T模板参数不是boost::arg<N>类型的话, add_value::type就是_bi::value<T> | |
![]() | ![]() |