2016-05-04 16 views
2

C++の概念のいくつかを調べているうちに、std :: is_base_ofロジックを見つけました。C++でのstd :: is_base_ofのロジック11

ロジックについては、次のコードが生成されていますが、理解できません。

誰かがどのように動作するか説明できますか?

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

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

}; 


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

@KerrekSB上記のSFINAEはどこですか? – Yakk

+0

@Barryリンクされた質問は異なるコードを説明しています。それらは 'is_base_of'の両方の試みですが、リンクされたものは私的継承の問題を解決するように見えますが、(私が推測する限り)上記のものはそうではなく(結果としてより簡単です)。 Neerajさんは​​、 'is_base_of'がどの言語で実装できるか知りたいのですか?あるいは、あなたが投稿したコードがどのように動作するのか知りたいですか? – Yakk

+2

@KerrekSB:そうですか?私には基本的な過負荷解決のように見えます。 'D *'は暗黙的に 'B *' iif(ish)に変換されます。 'B'は' D'の基底です。そのオーバーロードは 'No'の3倍のサイズの' Yes'の値を返します。これは 'sizeof'でテストできます。それ以外の場合は '...'オーバーロードが呼び出され、 'No'が返されます。そして、ケーキのアイシングは、全体が評価されていないコンテキストにあるため、実際には何も呼び出されず、すべてがコンパイル時定数として使用できるということです。 –

答えて

1

BDの基底クラスである場合、コールTest(static_cast<D*>(0))Yes Test(B*)に解決されます。それ以外の場合は、No Test(...)に解決されます。

BDの基底クラスである場合、sizeof(Test(static_cast<D*>(0)))の値はsizeof(Yes)あります。それ以外の場合は、sizeof(No)に等しくなります。

YesおよびNoは、sizeof(No)と決して等しくないように定義される。

BDの基底クラスである場合、

sizeof(Test(static_cast<D*>(0))) == sizeof(Yes) 

trueに評価します。それ以外の場合は、falseと評価されます。

+0

ありがとうR Sahu。 確かに私はここにいくつかの基本が欠けています。 static_cast演算子で渡される0(式)の役割は何ですか? – Neeraj

+2

@ Neerajそれは古い学校の 'nullptr'です – Yakk

関連する問題