我有 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!
}
};
如果没有其他人提出任何问题,我会发布详细信息作为答案。