「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > SFINAE がクラス テンプレートのメンバー関数で機能しないのはなぜですか?

SFINAE がクラス テンプレートのメンバー関数で機能しないのはなぜですか?

2024 年 11 月 10 日に公開
ブラウズ:757

Why Doesn't SFINAE Work with Member Functions of Class Templates?

クラス テンプレートのメンバー関数に対して SFINAE (enable_if) が機能しないのはなぜですか?

C では、SFINAE (Substitution Failure Is Not An Error) を使用すると、次のことが可能になります。テンプレート引数のタイプに応じてコードを有効または無効にします。ただし、クラス テンプレートのメンバー関数を扱う場合、SFINAE は期待どおりに動作しないことがよくあります。

問題を示す例を次に示します:

#include 

struct A {};
struct B {};

template 
struct Foo
{
    typename std::enable_if<:is_same a>::value>::type bar()
    {}

    typename std::enable_if<:is_same b>::value>::type bar()
    {}
};

この例では、Foo は 2 つのオーバーロードされたメンバー関数 bar() を定義します。最初のオーバーロードは T が A の場合に有効になり、2 番目のオーバーロードは T が B の場合に有効になります。ただし、このコードをコンパイルしようとすると、オーバーロードを解決できないことを示すエラー メッセージが表示されます。

このエラーの理由は、SFINAE が deduced テンプレート引数に対してのみ機能するためです。クラス テンプレートのメンバー関数の場合、テンプレート引数は推定されず、明示的に指定されます。この問題を解決するには、次のいずれかの手法を使用できます:

  • 明示的なテンプレート引数を使用する:

    struct Foo
    {
      void bar(A) {}
      void bar(B) {}
    };
  • メンバー関数内で std::enable_if を使用します:

    template 
    struct Foo
    {
      template
      typename std::enable_if<:is_same a>::value>::type bar() {}
    
      template
      typename std::enable_if<:is_same b>::value>::type bar() {}
    };
  • 明示的なクラス テンプレートの特殊化を使用します:

    template  struct Foo { void bar() {} };
    template  struct Foo { void bar() {} };
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3