访问控制不适用于显式模板实例化的参数 ( [temp.explicit]/12
)。这可以被用来为私有成员提供公共访问权限(由 litb 提供):
首先是一些设置代码:
template<typename Tag>
struct result {
/* export it ... */
typedef typename Tag::type type;
static type ptr;
};
template<typename Tag>
typename result<Tag>::type result<Tag>::ptr;
template<typename Tag, typename Tag::type p>
struct rob : result<Tag> {
/* fill it ... */
struct filler {
filler() { result<Tag>::ptr = p; }
};
static filler filler_obj;
};
template<typename Tag, typename Tag::type p>
typename rob<Tag, p>::filler rob<Tag, p>::filler_obj;
现在定义Point
:
class Point
{
public:
Point() : m_i(0) {}
void PrintPrivate(){cout << m_i << endl; }
private:
int m_i;
};
现在result<Pointm_i>::ptr
通过显式实例化来填写rob<Pointm_i, &Point::m_i>
——这是一个显式模板实例化,因此访问控制不适用:
struct Pointm_i { typedef int Point::*type; };
template class rob<Pointm_i, &Point::m_i>;
并访问私有成员:
void ChangePrivate ( Point &i ) { (i.*result<Pointm_i>::ptr)++; }
int main()
{
Point sPoint;
sPoint.PrintPrivate();
ChangePrivate(sPoint);
sPoint.PrintPrivate();
}