我只想让Base<DerivedImpl>::fct1()
可以访问类DerivedImpl
成员。
底座看起来像:
template < typename Derived>
class Base<Derived>{
protected:
void fct1(){
static_cast<Derived*>(this)->topfunc();
}
void fct2(){
...
}
};
派生类如下:
class DerivedImpl: public Base<DerivedImpl>{
void callbase(){fct1();}
void topfunc(){std::cout << "topfunc" <<std::endl;}
friend Base<DerivedImpl>; //this works
//friend void Base<DerivedImpl>::fct1(); //does not work!!
};
主要C++:
int main(){
DerivedImpl obj;
obj.callbase();
}
最佳答案
免责声明:这可以回答所问的问题,但是我认为,最好采用其他设计方法,因此,除非绝对必要,否则我建议您不要在生产中这样做。
您可以通过滥用以下事实来解决此问题:派生类被允许访问其父类的protected
静态成员:
#include <iostream>
template<typename Derived>
class Base {
protected:
static void fct1(Base* self){
static_cast<Derived*>(self)->topfunc();
}
void fct2() {}
};
class DerivedImpl: public Base<DerivedImpl> {
void callbase() { fct1(this); }
void topfunc() { std::cout << "topfunc" << std::endl; }
friend void Base<DerivedImpl>::fct1(Base*); // works fine now!
};
关于c++11 - C++ CRTP:如何仅使基类的一个(某些)功能作为派生类的 friend ?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53230233/