1

我有 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* */ } };

那么我继续抛出一些 using 声明:

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::*使用声明以某种方式支持通配符一样。

更新:

我想出了一个解决方案,它递归地将 using 声明置于伪可变模板层次结构中。它实际上在客户端代码中看起来非常干净,看起来像这样:

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

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

4

0 回答 0