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