使用Enable_If條件選擇成員函數
任務是根據類別範本參數決定成員函數的呼叫。以下程式碼片段嘗試實現此目的:
#include
#include
template
struct Point
{
void MyFunction(typename std::enable_if<:is_same int>::value, T &>::type* = 0)
{
std::cout ::value, float &>::type* = 0)
{
std::cout 但是,此程式碼無法編譯,並出現錯誤「在 'struct std::enable_if' 中沒有名為 'type' 的型別」。
SFINAE in Action
理解這個問題的關鍵在於替換失敗不是錯誤(SFINAE)的概念。 Enable_if 允許基於模板參數進行條件編譯。在這種情況下,當實例化成員函數時,模板參數 T 是已知的。因此,在實例化時評估條件並選擇相應的函數。
修復程式碼
為了修正這個問題,我們需要引入一個虛擬範本參數預設為 T。這允許 SFINAE 機制按預期工作。修改後的程式碼如下所示:
template
struct Point
{
template
typename std::enable_if<:is_same int>::value>::type
MyFunction()
{
std::cout
typename std::enable_if<:is_same float>::value>::type
MyFunction()
{
std::cout 防止顯式成員函數特化
正如HostileFork 所指出的,原始程式碼允許明確指定成員函數的範本參數,這可能會導致結果不正確。為了防止這種情況,我們可以新增一個 static_assert 來檢查是否提供了任何模板參數。這確保了始終根據模板參數 T 呼叫正確的成員函數。修改後的程式碼為:
template
struct Point
{
template
typename std::enable_if<:is_same int>::value>::type
MyFunction()
{
static_assert(sizeof...(Dummy)==0, "Do not specify template arguments!");
std::cout
typename std::enable_if<:is_same float>::value>::type
MyFunction()
{
static_assert(sizeof...(Dummy)==0, "Do not specify template arguments!");
std::cout
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3