我有一个模板类,我需要为其访问模板参数的 protected 成员函数,如下所示:
class Foo
{
protected:
void foo() {}
};
template<typename T>
class Bar
{
public:
static void bar(T& self){self.foo();}
};
...
Foo f;
Bar<Foo>::bar(f);
我的问题是访问 protected 方法。我尝试将 friend class T
放入 Bar,但这在 C++ 中似乎是不允许的(编辑:并且无论如何也无法解决我的问题,所以看起来)。我尝试让 Bar 从 T 继承(template<typename T> class Bar: public T
(本可以使用私有(private)继承,但 Bar 的公共(public)接口(interface)并不是非常重要,因为类本身只是内部类)),但这也不允许访问 foo()
。那么如何访问 foo()
方法呢?
编辑:
Foo
不需要知道 Bar<Foo>
,因为有很多 Bar
类。但是,我可以对 Foo 进行其他更改(当然无需更改公共(public)接口(interface))。
最佳答案
好吧,这是一个“烂在 hell ”的黑客攻击。您可以滥用这样一个事实,即您可以形成成员指针,指向派生类中 protected 基成员。
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);
}
关于c++ - 访问模板参数的 protected 成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3364722/