重複するセットによる多重継承におけるクラス メンバーの曖昧さの回避
C では、型のセットが重複する多重継承により呼び出し時にあいまいさが生じる可能性があります。テンプレートパラメータを持つメンバー関数。その理由を理解するために、基本クラスのテンプレートを調べてみましょう。
<code class="cpp">template <typename ... Types> class Base { public: template <typename T> typename std::enable_if<Contains<T, Types ...>::value>::type foo() { std::cout << "Base::foo()\n"; } };
foo() メンバーは、指定されたテンプレート パラメーターが Base のテンプレート パラメーター リストに存在する場合にのみ呼び出すことができます。ここで、型のセットが重複しない Base の複数のインスタンスから継承する派生クラス Derived を定義するとします。
<code class="cpp">struct Derived: public Base<int, char>, public Base<double, void> {};</code>
Derived().foo
考えられる解決策
<code class="cpp">template <typename... Bases> struct BaseCollector; template <typename Base> struct BaseCollector<Base> : Base { using Base::foo; }; template <typename Base, typename... Bases> struct BaseCollector<Base, Bases...>: Base, BaseCollector<Bases...> { using Base::foo; using BaseCollector<Bases...>::foo; }; struct Derived: public BaseCollector<Base<int, char>, Base<double, void>> {};</code>
このアプローチにより、明示的な using 宣言や基本クラスの仕様を必要とせずに、派生クラスが正しい基本クラス実装にアクセスできるようになります。
曖昧さと重複するセットを使用した多重継承で効果的なソリューションを実装することは、明確で正しいコード実行を保証するのに役立ちます。
以上が## 型セットが重複する複数の継承におけるクラス メンバー呼び出しの曖昧さを解消するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。