首頁  >  文章  >  後端開發  >  為什麼 SFINAE 不使用類別模板的成員函數?

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

Barbara Streisand
Barbara Streisand原創
2024-11-04 21:55:02172瀏覽

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

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

在 C 中,SFINAE(替換失敗不是錯誤)可讓您根據範本參數的類型啟用或停用程式碼。然而,在處理類別模板的成員函數時,SFINAE 通常無法如預期運作。

以下是一個示範問題的範例:

<code class="cpp">#include <type_traits>

struct A {};
struct B {};

template <typename T>
struct Foo
{
    typename std::enable_if<std::is_same<T, A>::value>::type bar()
    {}

    typename std::enable_if<std::is_same<T, B>::value>::type bar()
    {}
};</code>

在此範例中,Foo 定義兩個重載成員函數 bar()。第一個重載在 T 為 A 時啟用,第二個重載在 T 為 B 時啟用。但是,如果您嘗試編譯此程式碼,您將收到一條錯誤訊息,指示無法解析重載。

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

  • 使用明確範本參數:

    <code class="cpp">struct Foo
    {
      void bar(A) {}
      void bar(B) {}
    };</code>
  • 在成員函數中使用std::enable_if:

    <code class="cpp">template <typename T>
    struct Foo
    {
      template<typename U = T>
      typename std::enable_if<std::is_same<U, A>::value>::type bar() {}
    
      template<typename U = T>
      typename std::enable_if<std::is_same<U, B>::value>::type bar() {}
    };</code>
  • 使用顯式類模板特化:

    <code class="cpp">template <> struct Foo<A> { void bar() {} };
    template <> struct Foo<B> { void bar() {} };</code>

以上是為什麼 SFINAE 不使用類別模板的成員函數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn