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;
}
@KerrekSB上記のSFINAEはどこですか? – Yakk
@Barryリンクされた質問は異なるコードを説明しています。それらは 'is_base_of'の両方の試みですが、リンクされたものは私的継承の問題を解決するように見えますが、(私が推測する限り)上記のものはそうではなく(結果としてより簡単です)。 Neerajさんは、 'is_base_of'がどの言語で実装できるか知りたいのですか?あるいは、あなたが投稿したコードがどのように動作するのか知りたいですか? – Yakk
@KerrekSB:そうですか?私には基本的な過負荷解決のように見えます。 'D *'は暗黙的に 'B *' iif(ish)に変換されます。 'B'は' D'の基底です。そのオーバーロードは 'No'の3倍のサイズの' Yes'の値を返します。これは 'sizeof'でテストできます。それ以外の場合は '...'オーバーロードが呼び出され、 'No'が返されます。そして、ケーキのアイシングは、全体が評価されていないコンテキストにあるため、実際には何も呼び出されず、すべてがコンパイル時定数として使用できるということです。 –