gpt4 book ai didi

c++ - 来自私有(private) CRTP 基地的回调

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:37:50 24 4
gpt4 key购买 nike

以下代码不起作用,因为您不能从私有(private)基类static_cast

用 C 风格的转换来替换转换是可行的(尽管我最初认为这会调用未定义的行为,但显然它不会,请参阅 this answer ),但是相当丑陋,因为它还允许您绕过常量检查等. 另一种方法是使 CRTPBase 成为友元,但这会暴露所有 Derived 的私有(private)成员。

是否有另一种不使用 C 风格转换也不使 CRTPBase 成为友元的编写方式?

template<typename T>
struct CRTPBase {
void callBase() {
T * derived = static_cast<T*>(this);
derived->publicMethod();
}
};

struct Derived : private CRTPBase<Derived> {
void callParent() { this->callBase(); }
void publicMethod() {}
};

int main() {
Derived d;
d.callParent();
return 0;
}

最佳答案

我认为最好的解决方案是避免私有(private)继承,而是选择数据隐藏。将成员函数标记为 protected 将防止从派生类以外的任何地方进行访问。取而代之的是进一步的奖金公共(public)继承。

template<typename T>
class CRTPBase {
protected:
void callBase() {
T * derived = static_cast<T*>(this);
derived->publicMethod();
}
};

struct Derived : public CRTPBase<Derived> {
void callParent() { this->callBase(); }
void publicMethod() {}
};

int main() {
Derived d;
d.callParent();
d.callBase() // <- illegal
return 0;
}

关于c++ - 来自私有(private) CRTP 基地的回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23201429/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com