0

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

1 回答 1

1

static_cast: [expr.static.cast]/11

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

因此,您需要将 from 转换crtp<...>*为子类child*,然后您甚至可以使用隐式转换为base,例如

crtpT::base_type* p = static_cast<crtpT*>(this);
于 2013-07-21T13:23:48.183 回答