在 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