#include <iostream>
#include <memory>
using namespace std;

template<typename T>
struct Creator
{
  static T* create() { return new T;}
};


struct Foo : public Creator<Foo>
{};

int main() {
	
	Foo * foo = new Foo;
	cout << "Is Foo? " << (dynamic_cast<Foo*>(foo) != nullptr) << endl;
	cout << "Is Creator<Foo>? " << (dynamic_cast<Creator<Foo>*>(foo) != nullptr) << endl;
	
	return 0;
}