問題:
クラス メンバーのバージョンの決定クラスのテンプレート パラメーターに基づいて関数を呼び出す必要があるのは、難しい場合があります。 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 サイトの他の関連記事を参照してください。