The intention is to detect whether the Template type parameter D
is derived from Template type parameter B
. The below code has private static methods in the class IsDerivedHelper
. The question is How does the static method inside the Helper class works?
It doesn't have a definition in it.
#include<iostream>
#include<type_traits>
using namespace std;
class IOne
{
private:
public:
IOne() = delete;
virtual void print() = 0;
};
class One :public IOne
{
public:
One() = default;
virtual void print()
{
cout << "printed from class One" << endl;
}
};
class Two
{
};
template<typename D, typename B> class IsDerivedHelper
{
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) };
};
void main()
{
auto v = IsDerivedHelper<One, IOne>::Is; // Value is 1
// auto v = IsDerivedHelper<Two, IOne>::Is; // Value is 0
if (v)
{
cout << "Is derived" << endl;
}
else
{
cout << "Not a derived." << endl;
}
}
Thanks in advance.