簡體   English   中英

成員檢測代碼說明

[英]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;
};

DerivedFallbackT繼承的部分讓我困惑,因為當我們執行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.

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