c++ - 访问模板参数的 protected 成员

标签 c++ templates visibility

我有一个模板类,我需要为其访问模板参数的 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/

相关文章:

C++试图通过getline函数为函数调用获取用户输入值

c++ - 在 C++ 11 中将指针传递给临时变量?

php - 如何测试设置 protected 属性的构造函数?

C++ 找到尽可能接近给定 xy 的 n 个点

c++ - 如果是来自特定基类的派生类,如何转换

c++ - 带有模板参数的函数的编译问题

c++ - 如何转发声明 C++ 模板类?

ssrs-2008 - 在 SSRS 中使用条件来提高可见性

css - 纯 CSS。子元素的可见性取决于父类。是否可以?

c++ - std::map::find(char*) 在 Debug模式下无法在 64 位机器上运行