我有一个名为 base 的类。这个类是不可访问的(我的意思是源代码),因为它是一个第 3 方类。这个类有一个我想从(父)姐妹(比如说叔叔)类访问的方法。
class base {
public:
void do_something() {
std::cout << "base1::do_something" << std::endl;
}
};
我有另一个父类,它是通过使用crtp来访问子类的成员的:
template<typename crtpT>
class crtp {
public:
void foo() {
std::cout << "crtp::foo" << std::endl;
static_cast<crtpT*>(this)->bar();
//static_cast<crtpT::base_type*>(this)->do_something();
// how do i access base::bar
}
};
最后,一个继承自两者的子类:
template<typename baseT>
class child : public baseT, public crtp<child<baseT> > {
public:
typedef baseT base_type;
void bar() {
std::cout << "child::bar" << std::endl;
}
};
主.cpp:
int main(int argc, char* argv[]) {
child<base> ch;
ch.do_something();
ch.foo();
ch.bar();
return 0;
}
现在我的问题是,我需要do_something
从我的crtp类访问。这甚至可能吗?
static_cast 不起作用。我认为在生成 crtp 类时,编译器对基类一无所知。crtp 类必须是子类的父类,因为许多其他类都派生自它。否则我可以使用一个代表团到姐妹班。
编辑:
我可以在我的孩子体内做第二个 bar 方法,但这不是很好,因为我必须为基类中的所有方法编写包装器。
template<typename baseT>
class child : public baseT, public crtp<child<baseT> > {
public:
typedef baseT base_type;
void bar() {
std::cout << "child::bar" << std::endl;
}
void bar2() {
base_type::do_something();
}
};
并致电:
static_cast<crtpT*>(this)->bar2();