crtp父母访问姐妹班

时间:2013-07-21 12:54:21

标签: c++ inheritance crtp

我有一个名为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();

1 个答案:

答案 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);