簡體   English   中英

如何區分功能類型與SFINAE

[英]how to distinguish function type with SFINAE

我正在讀書C ++模板 它提到SFINAE(替換失敗不是錯誤)主體可用於檢測函數類型。 代碼示例:

template <typename T>
class IsFunctionT {
private:
   typedef char One;
   typedef struct { char a[2]; } Two;
   template<typename U> static One test(...);
   template<typename U> static Two test(U (*)[1]); // This test overloading I cannot understand 
public:
   enum { Yes = sizeof(IsFunctionT<T>::test<T>(0) == 1};
   enum { No = !Yes };
};

我理解它的目的是找到不能歸類為數組的函數,但它如何與U (*)[1] 我以前從未見過這個。

U( )[1]是一個指向1個元素數組的未命名指針。 並且0被視為指向U( )[1] 的int或null指針 ;

sizeof是測試函數返回類型,測試函數的實際結果不用作test()從不實際調用,只測試其返回類型。

簡而言之,如果表達形式不正確,SFINAE通過替換一種類型而不是硬性失敗來工作。 例如,您不能擁有一個函數數組,因此如果U是一個函數,則替換將失敗並且該重載將被丟棄。 現在正如評論所指出的那樣,您單獨發布的代碼並未涵蓋所有案例。 您需要其他專業化,即:

template<typename T>
class IsFunctionT<T&> {
  public:
    enum { Yes = 0 };
    enum { No = !Yes };
};

template<>
class IsFunctionT<void> {
  public:
    enum { Yes = 0 };
    enum { No = !Yes };
};

template<>
class IsFunctionT<void const> {
  public:
    enum { Yes = 0 };
    enum { No = !Yes };
};

從書中免費提供的源代碼中提取

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM