首頁 > 後端開發 > C++ > 主體

為什麼 SFINAE 對於類別模板成員函數失敗?

Mary-Kate Olsen
發布: 2024-11-04 22:18:02
原創
742 人瀏覽過

Why Does SFINAE Fail for Class Template Member Functions?

SFINAE 類別模板成員函數失敗

替換失敗,不是錯誤(SFINAE) 機制,常用於模板元編程,當應用於類別模板成員函數時,似乎表現出特殊的行為。

問題

考慮以下程式碼片段:

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

struct A{};
struct B{};

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

    // Conditional enable bar() for T == B
    typename std::enable_if<std::is_same<T, B>::value>::type
    bar()
    {}
};</code>
登入後複製

此程式碼嘗試在Foo 類別範本中定義bar() 的兩個重載,並使用SFINAE 根據T 的值有條件地啟用每個重載。但是,程式碼無法編譯,並出現以下錯誤:

<code class="cpp">error: 'typename std::enable_if<std::is_same<T, B>::value>::type Foo<T>::bar()' cannot be overloaded</code>
登入後複製

說明

SFINAE 通常用於啟用或停用基於模板參數的模板專業化。但是,SFINAE 僅適用於 推導的 模板參數,這意味著在重載解析期間自動推導的參數。對於成員函數,模板參數不是推導的,而是在實例化類別時明確指定的。因此,SFINAE 不適用於成員函數。

解決這個問題主要有兩種方法:

  • 使用函數模板:為每一個>
使用函數範本:
<code class="cpp">template <typename T>
void bar(Foo<T><- A) {}

template <typename T>
void bar(Foo<T><- B) {}
登入後複製
為每個重載定義單獨的函數模板,如下所示:
使用明確類別模板特化:
<code class="cpp">template <typename> struct Foo;

template <> struct Foo<A> { void bar() {} };
template <> struct Foo<B> { void bar() {} };</code>
登入後複製
定義單獨的函數模板每個重載的類別模板,如下圖:

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

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!