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
template
template
template
template
template
{
return unwrapper
}
template
{
return unwrapper
}
template
{
unwrapper
}
template
{
unwrapper
}
template
{
return a[ base_type::a1_ ] && a[ base_type::a2_ ];
}
template
{
return a[ base_type::a1_ ] && a[ base_type::a2_ ];
}
template
{
return a[ base_type::a1_ ] || a[ base_type::a2_ ];
}
template
{
return a[ base_type::a1_ ] || a[ base_type::a2_ ];
}
template
{
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。