[英]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.