【问题标题】:crtp parent access to sister classcrtp 父级访问姊妹类
【发布时间】:2013-07-20 07:13:43
【问题描述】:

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

main.cpp:

int main(int argc, char* argv[]) {
  child<base> ch;
  ch.do_something();
  ch.foo();
  ch.bar();
  return 0;
}

现在我的问题是,我需要从我的 crtp 类访问do_something。这甚至可能吗?

static_cast 不起作用。我认为在生成 crtp 类时,编译器对基类一无所知。 crtp class 必须是 class child 的父级,因为许多其他类都派生自它。否则我可以使用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();

【问题讨论】:

  • 你试过2static_casts吗?从crtpchildbase?

标签: c++ inheritance crtp


【解决方案1】:

static_cast: [expr.static.cast]/11

“指向 cv1 B 的指针”类型的纯右值,其中 B 是类类型,可以转换为“指向 cv2 D 的指针”类型的纯右值,其中 D 是从 B 派生的类 [...]

因此,您需要从crtp&lt;...&gt;* 转换为子类child*,然后您甚至可以使用隐式转换为base,例如

crtpT::base_type* p = static_cast<crtpT*>(this);

【讨论】: