ホームページ  >  記事  >  バックエンド開発  >  Enable_if を使用してテンプレート パラメーターに基づいて関数を選択する方法: 「'struct std::enable_if' に no type names \'type\'」エラーが発生する理由とその解決方法

Enable_if を使用してテンプレート パラメーターに基づいて関数を選択する方法: 「'struct std::enable_if' に no type names \'type\'」エラーが発生する理由とその解決方法

Susan Sarandon
Susan Sarandonオリジナル
2024-10-26 12:00:05626ブラウズ

How to Choose a Function Based on Template Parameters Using enable_if: Why does the

Enable_if を使用してテンプレート パラメーターに基づいて関数を選択する方法

問題:

クラス メンバーのバージョンの決定クラスのテンプレート パラメーターに基づいて関数を呼び出す必要があるのは、難しい場合があります。 Enable_if を使用すると解決策になる可能性がありますが、「'struct std::enable_if' に 'type' という名前の型がありません」などのエラーが発生する可能性があります。

Solution:

問題はテンプレート引数の置換にあります。 Enable_if は、テンプレート引数の置換中にエラーを引き起こすオーバーロードを排除することで機能します。提供されたコードでは、メンバ関数のインスタンス化時に T がすでに既知であるため、置換は行われません。

これを解決するには、デフォルトで T に設定されたダミーのテンプレート引数を作成し、それを SFINAE (置換失敗は発生しない) に使用します。エラーです)。問題のあるコードを次のコードに置き換えます。

<code class="cpp">template<typename T>
struct Point
{
  template<typename U = T>
  typename std::enable_if<std::is_same<U, int>::value>::type
    MyFunction()
  {
    std::cout << "T is int." << std::endl;
  }

  template<typename U = T>
  typename std::enable_if<std::is_same<U, float>::value>::type
    MyFunction()
  {
    std::cout << "T is not int." << std::endl;
  }
};</code>

注:

ユーザーがテンプレート引数を明示的に指定して誤った結果が得られる可能性を防ぐために、静的コードを追加できます。次の例に示すように、メンバー関数へのアサーション:

<code class="cpp">template<typename T>
struct Point
{
  template<typename... Dummy, typename U = T>
  typename std::enable_if<std::is_same<U, int>::value>::type
    MyFunction()
  {
    static_assert(sizeof...(Dummy)==0, "Do not specify template arguments!");
    std::cout << "T is int." << std::endl;
  }

  template<typename... Dummy, typename U = T>
  typename std::enable_if<std::is_same<U, float>::value>::type
    MyFunction()
  {
    static_assert(sizeof...(Dummy)==0, "Do not specify template arguments!");
    std::cout << "T is not int." << std::endl;
  }
};</code>

以上がEnable_if を使用してテンプレート パラメーターに基づいて関数を選択する方法: 「'struct std::enable_if' に no type names \'type\'」エラーが発生する理由とその解決方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。