CRTP-我可以做私人方法吗?

CRTP - Can I make a private method?

本文关键字:方法 我可以 CRTP-      更新时间:2023-10-16

我正在实现静态多态性:

template<typename T>
class Base {
public:
    void method() {
         // do something
         impl();
         // do something else
    }
    void impl() { // intended to be private
        static_cast<T*>(this)->impl();
    }
};
class Derived : public Base<Derived> {
public:
     void impl() { // intended to be private
     }
};

此代码是动态多态性类的静态实现,其中void stramp((是虚拟和私有的。

我已经实现了多态性(静态(。但是我必须将方法void nmpl((公开以允许从基类访问它。我希望method void inmand((再次成为私人。可以做吗?

更新:我不想写

friend class Base<Derived>;

在派生类中,因为它允许基础访问派生的所有成员。

在您的Derived类中添加一行:

class Derived : public Base<Derived> {
public:
private:
     void impl() { // intended to be private
     }
     friend class Base<Derived>;
};

将把基类指定为朋友,允许我以impl为私有编译代码。

编辑

@oliv在评论中建议的,律师 - 委托人成语的实现看起来像:


template<typename T>
class Attorney;
template<typename T>
class Base {
public:
    void method() {
        // do something
        impl();
        // do something else
    }
private:
    void impl() { // intended to be private
        Attorney<T>::impl(*static_cast<T*>(this));
    }
};

class Derived : public Base<Derived> {
private:
    void impl() { // intended to be private
    }
    friend class Attorney<Derived>;
};
template<typename T>
class Attorney {
private:
    friend class Base<Derived>;
    static void impl(Derived & c) { // add additional parameters as needed by impl
        c.impl();
    }
};
相关文章: