1

私はクラスA1、A2、およびBを持っています:

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

「call」という名前が A1 と A2 で共有されているため、署名が同じでなくても、コンパイラはこれらの名前を 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 には両方のメンバーを 1 つの屋根の下に配置する必要がありますか? それからそれは見てしまいます...まあ、非常にボイラープレートが重いです。

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