Enable_If 条件を使用したメンバー関数の選択
このタスクは、クラス テンプレート パラメーターに基づいてメンバー関数の呼び出しを決定することです。次のコード スニペットはこれを実現しようとします:
#include
#include
template
struct Point
{
void MyFunction(typename std::enable_if<:is_same int>::value, T &>::type* = 0)
{
std::cout ::value, float &>::type* = 0)
{
std::cout ただし、このコードはコンパイルに失敗し、「'struct std::enable_if' に 'type' という名前の型がありません」というエラーが表示されます。
SFINAE in Action
この問題を理解する鍵は、置換失敗はエラーではない (SFINAE) の概念にあります。 Enable_if により、テンプレート引数に基づいた条件付きコンパイルが可能になります。この場合、テンプレート引数 T は、メンバー関数がインスタンス化されるときにすでにわかっています。したがって、インスタンス化時に条件が評価され、対応する関数が選択されます。
コードの修正
これを修正するには、ダミーのテンプレート引数を導入する必要があります。デフォルトは T です。これにより、SFINAE メカニズムが意図したとおりに動作できるようになります。変更されたコードは次のようになります:
template
struct Point
{
template
typename std::enable_if<:is_same int>::value>::type
MyFunction()
{
std::cout
typename std::enable_if<:is_same float>::value>::type
MyFunction()
{
std::cout 明示的なメンバー関数の特殊化の防止
HostileFork によって指摘されているように、元のコードではメンバー関数のテンプレート引数を明示的に指定できます。間違った結果。これを防ぐために、テンプレート引数が提供されているかどうかを確認する static_assert を追加できます。これにより、テンプレート引数 T に基づいて正しいメンバー関数が常に呼び出されることになります。変更されたコードは次のようになります。
template
struct Point
{
template
typename std::enable_if<:is_same int>::value>::type
MyFunction()
{
static_assert(sizeof...(Dummy)==0, "Do not specify template arguments!");
std::cout
typename std::enable_if<:is_same float>::value>::type
MyFunction()
{
static_assert(sizeof...(Dummy)==0, "Do not specify template arguments!");
std::cout
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3