function object研究

2014-11-24 10:41:05 · 作者: · 浏览: 0

东西太多,有必要停下来仔细看一下几个基本的模板类,这里先看一下add_value_*模板。

template< class T, int I > struct add_value_2
{
typedef boost::arg type;
};

template< class T > struct add_value_2< T, 0 >
{
typedef _bi::value< T > type;
};

template struct add_value
{
typedef typename add_value_2< T, boost::is_placeholder< T >::value >::type type;
};

这是个模板特化应用。当传递boost::arg的时候,会通过boost::is_placeholder::value获取N的值。is_placeholder前面介绍了,就是判断T是否是boost::arg类型,如果是value为1,否则为0.

当为0的时候,编译器则找到add_value_2模板,这里用到了_bi::value模板,看一下定义:

template 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.

否则使用第一个add_value_2模板,这时候类型add_value_2::type就是boost::arg

总结:

add_value模板的功能是接受boost::arg类型作为T模板参数,add_value::type就是boost::arg

如果T模板参数不是boost::arg类型的话, add_value::type就是_bi::value