#include <iostream>
#include <string>
class Object
{
public:
void Test()
{
std::cout << "Test" << std::endl;
}
};
class EmptyObject
{
};
class Base
{
public:
virtual std::string Foo()
{
return "Base";
}
};
template <typename T>
class Derived : public Base
{
public:
virtual std::string Foo() override
{
return doFoo(std::is_same<T, Object>());
}
private:
std::string doFoo(std::true_type)
{
m_object.Test();
return "Derived";
}
std::string doFoo(std::false_type)
{
return Base::Foo();
}
T m_object;
};
int main()
{
Derived<Object> testObject;
std::cout << testObject.Foo() << std::endl;
Derived<EmptyObject> testEmpty;
std::cout << testEmpty.Foo() << std::endl;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgoKY2xhc3MgT2JqZWN0CnsKcHVibGljOgoJdm9pZCBUZXN0KCkKCXsKCQlzdGQ6OmNvdXQgPDwgIlRlc3QiIDw8IHN0ZDo6ZW5kbDsKCX0KfTsKCmNsYXNzIEVtcHR5T2JqZWN0CnsKfTsKCmNsYXNzIEJhc2UKewpwdWJsaWM6Cgl2aXJ0dWFsIHN0ZDo6c3RyaW5nIEZvbygpCgl7CgkJcmV0dXJuICJCYXNlIjsKCX0KfTsKCnRlbXBsYXRlIDx0eXBlbmFtZSBUPgpjbGFzcyBEZXJpdmVkIDogcHVibGljIEJhc2UKewpwdWJsaWM6Cgl2aXJ0dWFsIHN0ZDo6c3RyaW5nIEZvbygpIG92ZXJyaWRlCgl7CgkJcmV0dXJuIGRvRm9vKHN0ZDo6aXNfc2FtZTxULCBPYmplY3Q+KCkpOwoJfQoKcHJpdmF0ZToKCXN0ZDo6c3RyaW5nIGRvRm9vKHN0ZDo6dHJ1ZV90eXBlKQoJewoJCW1fb2JqZWN0LlRlc3QoKTsKCQlyZXR1cm4gIkRlcml2ZWQiOwoJfQoJc3RkOjpzdHJpbmcgZG9Gb28oc3RkOjpmYWxzZV90eXBlKQoJewoJCXJldHVybiBCYXNlOjpGb28oKTsKCX0KCVQgbV9vYmplY3Q7Cn07CgppbnQgbWFpbigpCnsKCURlcml2ZWQ8T2JqZWN0PiB0ZXN0T2JqZWN0OwoJc3RkOjpjb3V0IDw8IHRlc3RPYmplY3QuRm9vKCkgPDwgc3RkOjplbmRsOwoKCURlcml2ZWQ8RW1wdHlPYmplY3Q+IHRlc3RFbXB0eTsKCXN0ZDo6Y291dCA8PCB0ZXN0RW1wdHkuRm9vKCkgPDwgc3RkOjplbmRsOwp9