#include <iostream>
#include <memory>
struct Base
{
static std::shared_ptr<Base> Create(int args)
{
std::cout << "Base::Create(" << args << ")" << std::endl;
return std::make_shared<Base>();
}
};
template<typename T> struct Inherited: T
{
static std::shared_ptr<Base> Create(int args)
{
return T::Create(args);
}
};
struct Derived: Inherited<Base>
{
static std::shared_ptr<Base> Create(int args)
{
if (args <= 0)
{
Inherited::Create(args);
}
else
{
std::cout << "Derived::Create(" << args << ")" << std::endl;
return std::shared_ptr<Derived>();
}
}
};
int main()
{
Derived::Create(0);
Derived::Create(1);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWVtb3J5PgoKc3RydWN0IEJhc2UKewoJc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxCYXNlPiBDcmVhdGUoaW50IGFyZ3MpCgl7CgkJc3RkOjpjb3V0IDw8ICJCYXNlOjpDcmVhdGUoIiA8PCBhcmdzIDw8ICIpIiA8PCBzdGQ6OmVuZGw7CgkJcmV0dXJuIHN0ZDo6bWFrZV9zaGFyZWQ8QmFzZT4oKTsKCX0KfTsKCnRlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCBJbmhlcml0ZWQ6IFQKewoJc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxCYXNlPiBDcmVhdGUoaW50IGFyZ3MpCgl7CgkJcmV0dXJuIFQ6OkNyZWF0ZShhcmdzKTsKCX0KfTsKCnN0cnVjdCBEZXJpdmVkOiBJbmhlcml0ZWQ8QmFzZT4KewoJc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxCYXNlPiBDcmVhdGUoaW50IGFyZ3MpCgl7CgkJaWYgKGFyZ3MgPD0gMCkKCQl7CgkJCUluaGVyaXRlZDo6Q3JlYXRlKGFyZ3MpOwoJCX0KCQllbHNlCgkJewoJCQlzdGQ6OmNvdXQgPDwgIkRlcml2ZWQ6OkNyZWF0ZSgiIDw8IGFyZ3MgPDwgIikiIDw8IHN0ZDo6ZW5kbDsKCQkJcmV0dXJuIHN0ZDo6c2hhcmVkX3B0cjxEZXJpdmVkPigpOwoJCX0KCX0KfTsKCmludCBtYWluKCkKewoJRGVyaXZlZDo6Q3JlYXRlKDApOwoJRGVyaXZlZDo6Q3JlYXRlKDEpOwoJCglyZXR1cm4gMDsKfQ==