我有一个名为base的类。这个类是不可访问的(我的意思是源代码)因为它是第三方类。这个类有一个方法,我想从(父)妹妹(让我们说叔叔)类访问。
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;
}
};
main.cpp中:
int main(int argc, char* argv[]) {
child<base> ch;
ch.do_something();
ch.foo();
ch.bar();
return 0;
}
现在我的问题是,我需要从 crtp -class访问do_something
。这有可能吗?
static_cast不起作用。我认为在生成crtp类时,编译器对基类知之甚少。 crtp类必须是类class的父类,因为很多其他类都是从它派生的。否则我可以使用delegation to sister-class。
我可以在我的孩子里面做第二个bar方法,但这不是很好,因为我必须为 base 类中的所有方法编写包装器。
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();
答案 0 :(得分:1)
static_cast
:[expr.static.cast] / 11
类型为“指向cv1 B的指针”的prvalue,其中B是类类型,可以转换为类型为“指向cv2 D的指针”的prvalue,其中D是从B [...] <派生的类/ p>
因此,您需要将crtp<...>*
转换为子类child*
,然后您甚至可以使用隐式转换为base
,例如
crtpT::base_type* p = static_cast<crtpT*>(this);