灯火互联
管理员
管理员
  • 注册日期2011-07-27
  • 发帖数41778
  • QQ
  • 火币41290枚
  • 粉丝1086
  • 关注100
  • 终身成就奖
  • 最爱沙发
  • 忠实会员
  • 灌水天才奖
  • 贴图大师奖
  • 原创先锋奖
  • 特殊贡献奖
  • 宣传大使奖
  • 优秀斑竹奖
  • 社区明星
阅读:3568回复:0

function object研究

楼主#
更多 发布于:2012-12-08 13:33

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



喜欢0 评分0
游客

返回顶部