在派生类中使用多重继承的基类成员名称

时间:2013-06-29 05:16:41

标签: c++ inheritance multiple-inheritance mixins

我有A1,A2和B类:

struct A1 { int call(int); };
struct A2 { double call(double); };
struct B : public A1, public A2 {};

由于A1和A2共享名称'call',编译器会将这些名称隐藏在B中,即使签名不相同。

struct B { void do_stuff() { call(int(0)); /* call? call what? *ERROR* */ } };

然后我继续使用声明抛出一些:

struct B { using A1::call; using A2::call; void do_stuff() { call(int(0)); } };

一切都很笨拙。但是,如果A1和A2有很多类似命名的成员,例如。 A1和A2是某些模板类的特化,我们希望B将两者的成员集中在一个屋檐下?然后它最终看起来......好吧,非常沉重的样板。

struct B {
  using A1::call; using A2::call;
  using A1::asdf; using A2::asdf;
  using A1::other_thing; using A2::other_thing;
  ...
};

对于从低级类特化继承的数十个类,我必须做这种事情。是否有任何构造可以缓解这种键盘提示和可读性地狱?

using A1::*这样的东西,如果使用声明以某种方式支持globbing。

更新

我提出了一种解决方案,该解决方案以递归方式在伪可变参数模板层次结构中放置使用声明。实际上它看起来非常干净,看起来像这样:

class B : mixins<A1,A2> {
  void do_stuff() {
    call(int(0)); // I'm not a compiler error!
    call(double(0)); // neither am I!
  }
};

如果没有人提出任何问题,我会将详细信息作为答案发布。

0 个答案:

没有答案