簡體   English   中英

了解 std::is_base_of 的重新實現

[英]Understanding a reimplementation of std::is_base_of

我在網上遇到了以下代碼。 它本質上是為了說明一種實現std::is_base_of的方法(也許不准確)。

我添加了編號的注釋,以將行與下面提出的特定問題相關聯:

#include <type_traits>
#include <iostream>

class Q {};

class Z : public Q {};

template<typename D, typename B>
class IsDerivedFromHelper
{
    class No { };
    class Yes { No no[3]; };

    static Yes Test( B* );  // (1) (2)
    static No Test( ... );  // (1) (3)
public:
    enum { Is = sizeof(Test(static_cast<D*>(0))) == sizeof(Yes) }; // (4)

};

template <class C, class P> 
bool IsDerivedFrom() {
    return IsDerivedFromHelper<C, P>::Is;
}

int main(int argc, char** argv) {
    std::cout << IsDerivedFrom<Z, Q>() << std::endl;

    return 0;
}

這里有很多事情我沒有弄清楚。 協助將不勝感激。

  1. 在我看來, IsDerivedFromHelper定義了兩個同名Test )的 static 成員? 這怎么可能?

  2. NoYes類都沒有定義構造函數,這意味着它們只有默認的無參數構造函數。 如果是這樣,我們如何能夠將B* (或... )傳遞給Test()

  3. 我知道...表示可變參數 arguments。 但是——在這種情況下是什么意思?

  4. 同樣,使用D*類型的參數實例化Test ,其中Test的類型沒有定義構造函數。 這里發生了什么?

  1. 在我看來 IsDerivedFromHelper 定義了兩個同名的 static 成員(測試)? 這怎么可能?

那些同名的成員函數有不同的參數列表。 這稱為 function 過載。

  1. No 和 Yes 類都沒有定義構造函數,這意味着它們只有默認的無參數構造函數。 如果是這樣,我們如何將 B*(或...)傳遞給 Test()?

function 的返回類型對可以傳入什么參數沒有影響。

  1. 我明白......意味着可變參數 arguments。 但是——在這種情況下是什么意思?

可變參數 arguments。

  1. 同樣,使用 D* 類型的參數實例化 Test,其中 Test 的類型沒有定義構造函數。

調用function,而不是實例化 函數沒有構造函數。

這里發生了什么?

調用成員 function Test 根據模板類型 arguments,調用可能會解析為任一過載。

暫無
暫無

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

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