[英]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;
}
這里有很多事情我沒有弄清楚。 協助將不勝感激。
在我看來, IsDerivedFromHelper
定義了兩個同名( Test
)的 static 成員? 這怎么可能?
No
和Yes
類都沒有定義構造函數,這意味着它們只有默認的無參數構造函數。 如果是這樣,我們如何能夠將B*
(或...
)傳遞給Test()
?
我知道...
表示可變參數 arguments。 但是——在這種情況下是什么意思?
同樣,使用D*
類型的參數實例化Test
,其中Test
的類型沒有定義構造函數。 這里發生了什么?
- 在我看來 IsDerivedFromHelper 定義了兩個同名的 static 成員(測試)? 這怎么可能?
那些同名的成員函數有不同的參數列表。 這稱為 function 過載。
- No 和 Yes 類都沒有定義構造函數,這意味着它們只有默認的無參數構造函數。 如果是這樣,我們如何將 B*(或...)傳遞給 Test()?
function 的返回類型對可以傳入什么參數沒有影響。
- 我明白......意味着可變參數 arguments。 但是——在這種情況下是什么意思?
可變參數 arguments。
- 同樣,使用 D* 類型的參數實例化 Test,其中 Test 的類型沒有定義構造函數。
調用function,而不是實例化。 函數沒有構造函數。
這里發生了什么?
調用成員 function Test
。 根據模板類型 arguments,調用可能會解析為任一過載。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.