」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 為什麼 SFINAE 不使用類別模板的成員函數?

為什麼 SFINAE 不使用類別模板的成員函數?

發佈於2024-11-10
瀏覽:444

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

為什麼 SFINAE (enable_if) 不適用於類別模板的成員函數?

在 C 中,SFINAE(替換失敗不是錯誤)可讓您根據範本參數的類型啟用或停用程式碼。然而,在處理類別模板的成員函數時,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 定義了兩個重載成員函數 bar()。當 T 為 A 時啟用第一個重載,當 T 為 B 時啟用第二個重載。但是,如果您嘗試編譯此程式碼,您將收到一條錯誤訊息,指示無法解析重載。

出現此錯誤的原因是 SFINAE 僅適用於 推導的 範本參數。對於類別模板的成員函數,模板參數不是推導的,而是明確指定的。要解決此問題,您可以使用以下技術之一:

  • 使用明確範本參數:

    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