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