#include <type_traits>
// base
template<typename T> class Base {};
// public inheritance
class IntDeriv : public Base<int> {};
// public inheritance with private constructor
class IntDerivCPr : public Base<int>
{
private:
IntDerivCPr();
};
// private inheritance
class IntDerivPr : private Base<int> {};
// no inheritance
class Foo {};
template< class TestClass >
struct is_derived_from_Base
{
template<typename T>
static std::true_type inherited(Base<T>*);
static std::false_type inherited(void*);
static const bool value = decltype(inherited(new TestClass()))::value;
};
#include <iostream>
int main()
{
std::cout << std::boolalpha;
std::cout << is_derived_from_Base<Foo>::value << "\n"; // should print false
std::cout << is_derived_from_Base<IntDeriv>::value << "\n"; // should print true
//std::cout << is_derived_from_Base<IntDerivCPr>::value << "\n"; // does not compile
//std::cout << is_derived_from_Base<IntDerivPr>::value << "\n"; // should print false? true? (does not compile)
}
I2luY2x1ZGUgPHR5cGVfdHJhaXRzPgoKLy8gYmFzZQp0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBjbGFzcyBCYXNlIHt9OwovLyBwdWJsaWMgaW5oZXJpdGFuY2UKY2xhc3MgSW50RGVyaXYgOiBwdWJsaWMgQmFzZTxpbnQ+IHt9OwovLyBwdWJsaWMgaW5oZXJpdGFuY2Ugd2l0aCBwcml2YXRlIGNvbnN0cnVjdG9yCmNsYXNzIEludERlcml2Q1ByIDogcHVibGljIEJhc2U8aW50Pgp7CiAgIHByaXZhdGU6CiAgICAgIEludERlcml2Q1ByKCk7Cn07Ci8vIHByaXZhdGUgaW5oZXJpdGFuY2UKY2xhc3MgSW50RGVyaXZQciA6IHByaXZhdGUgQmFzZTxpbnQ+IHt9OwovLyBubyBpbmhlcml0YW5jZQpjbGFzcyBGb28ge307Cgp0ZW1wbGF0ZTwgY2xhc3MgVGVzdENsYXNzID4Kc3RydWN0IGlzX2Rlcml2ZWRfZnJvbV9CYXNlCnsKICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KICAgc3RhdGljIHN0ZDo6dHJ1ZV90eXBlIGluaGVyaXRlZChCYXNlPFQ+Kik7CiAgIHN0YXRpYyBzdGQ6OmZhbHNlX3R5cGUgaW5oZXJpdGVkKHZvaWQqKTsKCiAgIHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gZGVjbHR5cGUoaW5oZXJpdGVkKG5ldyBUZXN0Q2xhc3MoKSkpOjp2YWx1ZTsKfTsKCgojaW5jbHVkZSA8aW9zdHJlYW0+CgppbnQgbWFpbigpCnsKICAgc3RkOjpjb3V0IDw8IHN0ZDo6Ym9vbGFscGhhOwogICBzdGQ6OmNvdXQgPDwgaXNfZGVyaXZlZF9mcm9tX0Jhc2U8Rm9vPjo6dmFsdWUgPDwgIlxuIjsgICAgICAgICAvLyBzaG91bGQgcHJpbnQgZmFsc2UKICAgc3RkOjpjb3V0IDw8IGlzX2Rlcml2ZWRfZnJvbV9CYXNlPEludERlcml2Pjo6dmFsdWUgPDwgIlxuIjsgICAgLy8gc2hvdWxkIHByaW50IHRydWUKICAgLy9zdGQ6OmNvdXQgPDwgaXNfZGVyaXZlZF9mcm9tX0Jhc2U8SW50RGVyaXZDUHI+Ojp2YWx1ZSA8PCAiXG4iOyAgICAvLyBkb2VzIG5vdCBjb21waWxlCiAgIC8vc3RkOjpjb3V0IDw8IGlzX2Rlcml2ZWRfZnJvbV9CYXNlPEludERlcml2UHI+Ojp2YWx1ZSA8PCAiXG4iOyAgICAvLyBzaG91bGQgcHJpbnQgZmFsc2U/IHRydWU/IChkb2VzIG5vdCBjb21waWxlKQp9Cg==