首頁 > 後端開發 > C++ > C 中的 SFINAE:條件模板專業化的回傳類型與參數類型?

C 中的 SFINAE:條件模板專業化的回傳類型與參數類型?

Mary-Kate Olsen
發布: 2024-12-13 02:33:13
原創
677 人瀏覽過

SFINAE in C  : Return Type vs. Parameter Type for Conditional Template Specialization?

模板回傳類型與參數中的SFINAE

問題描述

在C 語言中,SFINAE(替換失敗不是錯誤)可用於根據類型不是錯誤特徵有條件地啟用或停用範本專業化。然而,當 SFINAE 在模板傳回類型和模板參數中套用不同時,會出現一個常見問題。

考慮以下主要函數:

int main()
{
    foo(5);
    foo(3.4);
}
登入後複製

在模板參數中使用SFINAE 的錯誤實作

當SFINAE放入模板參數時,如下圖,編譯失敗錯誤:

template<typename T,
         typename = typename std::enable_if<std::is_integral<T>::value>::type>
auto foo(T) -> void
{
    std::cout << "I'm an integrer!\n";
}

template<typename T,
         typename = typename std::enable_if<std::is_floating_point<T>::value>::type>
auto foo(T) -> void
{
    std::cout << "I'm a floating point number!\n";
}
登入後複製

在回傳類型中使用SFINAE的正確實作

但是,此實作可以正常運作:

template<typename T>
auto foo(T) -> typename std::enable_if<std::is_integral<T>::value>::type
{
    std::cout << "I'm an integrer!\n";
}

template<typename T>
auto foo(T) -> typename std::enable_if<std::is_floating_point<T>::value>::type
{
    std::cout << "I'm a floating point number!\n";
}
登入後複製

說明

差異在於C 標準(14.5.6.1) 定義函數範本重載的方式。如果重載範本具有相同的函數名稱、相同的參數數量和相同的參數類型,則它們是等效的。但是,此比較中不考慮預設模板參數。

在錯誤的實作中,SFINAE 條件作為預設模板參數包含在內,導致兩個相同的函數模板定義了兩次。這會觸發編譯錯誤。

在正確的實作中,SFINAE 條件用作模板傳回類型的一部分。由於這涉及引用模板參數的表達式,因此這兩個函數具有不同的簽名,從而允許 SFINAE 按預期運行。

以上是C 中的 SFINAE:條件模板專業化的回傳類型與參數類型?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板