| 东西太多,有必要停下来仔细看一下几个基本的模板类,这里先看一下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>
| |