我的好友模板可以在其实例化中提及我的私有成员吗?
Can my befriended template mention my private member in its instantiation?
我正在编写一个模板 class,它采用 class 和 class 中的方法名称。我必须这样做,因为尽管我将用来实例化我的模板的各种 class 具有类似的方法,但方法名称从 class 到 class 不等,但具有共同的签名。在某些情况下,所讨论的方法是私有的。因此,我想通过友元声明来扩充这样的 classes,以授予我的模板访问私有方法的权限。
template<class T, int (T::*func)()>
class A {
public:
int count(T* p) { return (p->*func)(); }
};
class B {
public:
int funcPublic() { return 0; }
};
class C {
template<class T, int (T::*)()> friend class A;
private:
int funcPrivate() { return 0; }
};
typedef A<B, &B::funcPublic > AB; // works
typedef A<C, &C::funcPrivate> AC; // g++: "error: ‘int C::funcPrivate()’ is private"
访问控制似乎在提及时(即 模板实例化)而不是在使用时进行检查。这是 C++ 的指定方式吗?是我运气不好吗?
如果您可以修改您的 class C
,您似乎可以按如下方式解决它:
class C
{
private:
int funcPrivate() { return 0; }
public:
typedef A<C, &C::funcPrivate> value;
};
typedef C::value AC;
通过这种方法,您实际上不必再使用 friend
来扩充此类 class。
但是,如果该方法满足您的要求,请考虑提供适当的接口来调用该方法。
我正在编写一个模板 class,它采用 class 和 class 中的方法名称。我必须这样做,因为尽管我将用来实例化我的模板的各种 class 具有类似的方法,但方法名称从 class 到 class 不等,但具有共同的签名。在某些情况下,所讨论的方法是私有的。因此,我想通过友元声明来扩充这样的 classes,以授予我的模板访问私有方法的权限。
template<class T, int (T::*func)()>
class A {
public:
int count(T* p) { return (p->*func)(); }
};
class B {
public:
int funcPublic() { return 0; }
};
class C {
template<class T, int (T::*)()> friend class A;
private:
int funcPrivate() { return 0; }
};
typedef A<B, &B::funcPublic > AB; // works
typedef A<C, &C::funcPrivate> AC; // g++: "error: ‘int C::funcPrivate()’ is private"
访问控制似乎在提及时(即 模板实例化)而不是在使用时进行检查。这是 C++ 的指定方式吗?是我运气不好吗?
如果您可以修改您的 class C
,您似乎可以按如下方式解决它:
class C
{
private:
int funcPrivate() { return 0; }
public:
typedef A<C, &C::funcPrivate> value;
};
typedef C::value AC;
通过这种方法,您实际上不必再使用 friend
来扩充此类 class。
但是,如果该方法满足您的要求,请考虑提供适当的接口来调用该方法。