function object研究之listN分析

2014-11-24 08:53:13 · 作者: · 浏览: 1

list2 通过继承storage2来包含两个成员a1_和a2_

[cpp]
struct logical_and;
struct logical_or;

template< class A1, class A2 > class list2: private storage2< A1, A2 >
{
private:

typedef storage2< A1, A2 > base_type;

public:

list2( A1 a1, A2 a2 ): base_type( a1, a2 ) {}

A1 operator[] (boost::arg<1>) const { return base_type::a1_; }
A2 operator[] (boost::arg<2>) const { return base_type::a2_; }

A1 operator[] (boost::arg<1> (*) ()) const { return base_type::a1_; }
A2 operator[] (boost::arg<2> (*) ()) const { return base_type::a2_; }

template T & operator[] (_bi::value & v) const { return v.get(); }

template T const & operator[] (_bi::value const & v) const { return v.get(); }

template T & operator[] (reference_wrapper const & v) const { return v.get(); }

template typename result_traits::type operator[] (bind_t & b) const { return b.eva l(*this); }

template typename result_traits::type operator[] (bind_t const & b) const { return b.eva l(*this); }

template R operator()(type, F & f, A & a, long)
{
return unwrapper::unwrap(f, 0)(a[base_type::a1_], a[base_type::a2_]);
}

template R operator()(type, F const & f, A & a, long) const
{
return unwrapper::unwrap(f, 0)(a[base_type::a1_], a[base_type::a2_]);
}

template void operator()(type, F & f, A & a, int)
{
unwrapper::unwrap(f, 0)(a[base_type::a1_], a[base_type::a2_]);
}

template void operator()(type, F const & f, A & a, int) const
{
unwrapper::unwrap(f, 0)(a[base_type::a1_], a[base_type::a2_]);
}

template bool operator()( type, logical_and & /*f*/, A & a, int )
{
return a[ base_type::a1_ ] && a[ base_type::a2_ ];
}

template bool operator()( type, logical_and const & /*f*/, A & a, int ) const
{
return a[ base_type::a1_ ] && a[ base_type::a2_ ];
}

template bool operator()( type, logical_or & /*f*/, A & a, int )
{
return a[ base_type::a1_ ] || a[ base_type::a2_ ];
}

template bool operator()( type, logical_or const & /*f*/, A & a, int ) const
{
return a[ base_type::a1_ ] || a[ base_type::a2_ ];
}

template void accept(V & v) const
{
base_type::accept(v);
}

bool operator==(list2 const & rhs) const
{
return ref_compare(base_type::a1_, rhs.a1_, 0) && ref_compare(base_type::a2_, rhs.a2_, 0);
}
};
代码一上来定义了两个空的类,表示逻辑与和或。
下面四个函数比list1要多点:

[cpp]
A1 operator[] (boost::arg<1>) const { return base_type::a1_; }
A2 operator[] (boost::arg<2>) const { return base_type::a2_; }

A1 operator[] (boost::arg<1> (*) ()) const { return base_type::a1_; }
A2 operator[] (boost::arg<2> (*) ()) const { return base_type::a2_; }

其他的list3-list9也类似。
总结:listN模板通过继承storageN模板,获得了保存对应数目的占位符的能力。并提供了数组操作符operator[]()来获取这些占位符对象,同时因为提供了operator()(),自己也是function object,而且这些operator()()能够用执行参数f表示的函数,并传递自己拥有的参数给f。