我有一个模板类,我需要访问模板参数的受保护成员函数,如下所示:
class Foo
{
protected:
void foo() {}
};
template<typename T>
class Bar
{
public:
static void bar(T& self){self.foo();}
};
...
Foo f;
Bar<Foo>::bar(f);
我的问题是访问受保护的方法。我尝试将friend class T
放入Bar中,但在c ++中似乎不允许这样做(编辑:无论如何都不会解决我的问题,所以看起来似乎)。我试过让Bar继承自T(template<typename T> class Bar: public T
(本来可以使用私有继承,但Bar的公共接口并不是非常重要,因为类本身只是内部的)),但这不允许访问foo()
也是。那么如何才能访问foo()
方法?
编辑:
Foo
不应该知道Bar<Foo>
,因为有很多Bar
个类。然而,我可以对Foo进行其他更改(当然不改变公共接口)。
答案 0 :(得分:5)
class Foo
{
protected:
void foo() {}
};
// Helper template to bypass protected access control
// for a member function called foo, taking no parameters
// and returning void.
template<typename T>
struct Unprotect : public T
{
typedef void (T::*FooPtr)();
static FooPtr GetFooPtr()
{
return &Unprotect::foo;
}
};
template<typename T>
class Bar
{
public:
static void bar(T& self){(self.*Unprotect<Foo>::GetFooPtr())();}
};
int main()
{
Foo f;
Bar<Foo>::bar(f);
}
答案 1 :(得分:2)
你在错误的方向做了你的朋友宣言。如果Bar
说Foo
是朋友,则表示Foo
可以访问Bar
的私人数据。要让Bar
访问Foo
的私人数据,Foo
必须说Bar
是其朋友。
答案 2 :(得分:0)
template<typename T>
class Bar
{
public:
static void bar(T& self){self.foo();}
};
class Foo
{
protected:
void foo() {}
friend class Bar<Foo>;
};
void main()
{
Foo f;
Bar<Foo>::bar(f);
}