[英]Explanation on Member Detection code
它不是整個概念,而是用於確定類是否具有n
數據成員的方法之一。 這是完整的代碼; 普通使用SFINAE進行成員檢測。
template <typename T>
struct has_X {
struct Fallback { int X; };
struct Derived : T, Fallback {};
template <typename U, U> struct S;
template <typename C> static char (&f(S<int Fallback::*, &C::X> *))[1];
template <typename C> static char (&f(...))[2];
public:
const static bool value = sizeof(f<Derived>(0)) == 2;
};
Derived
從Fallback
和T
繼承的部分讓我困惑,因為當我們執行f
的重載時, &C::X
是&Derived::X
但是不應該總是選擇這個重載,因為它不是Derived
保證有X
因為它繼承了具有該數據成員的Fallback
嗎?
也許我忽略了一些東西。 然而,這種單一的代碼表明,教我的東西我從來不知道,也許有一些這一點。 我期望的是總是選擇那個重載(不是帶有...
那個),因為Derived
應該總是有X
因為它繼承自Fallback
。 但這種情況並非如此。 有人可以解釋一下原因嗎?
Fallback
有一個名為X
數據成員,但如果T
還有一個名為X
的成員,則Derived會有兩個 ,在這種情況下, Derived::X
不能明確地獲取。 因此,如果T
沒有X
,則使用第一個重載,如果T
具有X
,則使用第二個更通用的版本。 這就是為什么你可以根據返回類型的大小來區分這些情況。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.