#include <iostream>
struct Quad
{
Quad(const size_t side){ std::cout<< "build quad: "<<side<<"\n"; }
};
struct Rect
{
Rect(const size_t w,const size_t h){ std::cout<< "build rect: "<<w<<" : "<<h<<"\n"; }
};
struct Factory_figures
{
Factory_figures(){ count +=10; }
operator Quad() { return Quad(count); }
operator Rect() { return Rect(count,count); }
static size_t count;
};
size_t Factory_figures::count=0;
template<class T>struct Figure
{
Figure(const T& src = Factory_figures() ){}
};
int main()
{
Figure<Quad> f1;
Figure<Quad> f2;
Figure<Quad> f3;
Figure<Rect> f4;
Figure<Rect> f5;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgogCnN0cnVjdCBRdWFkCnsKICAgIFF1YWQoY29uc3Qgc2l6ZV90IHNpZGUpeyBzdGQ6OmNvdXQ8PCAiYnVpbGQgcXVhZDogIjw8c2lkZTw8IlxuIjsgfQp9OwogCnN0cnVjdCBSZWN0CnsKICAgIFJlY3QoY29uc3Qgc2l6ZV90IHcsY29uc3Qgc2l6ZV90IGgpeyBzdGQ6OmNvdXQ8PCAiYnVpbGQgcmVjdDogIjw8dzw8IiA6ICI8PGg8PCJcbiI7IH0KfTsKIApzdHJ1Y3QgRmFjdG9yeV9maWd1cmVzCnsKICAgIEZhY3RvcnlfZmlndXJlcygpeyBjb3VudCArPTEwOyB9CiAgICBvcGVyYXRvciBRdWFkKCkgeyByZXR1cm4gUXVhZChjb3VudCk7IH0KICAgIG9wZXJhdG9yIFJlY3QoKSB7IHJldHVybiBSZWN0KGNvdW50LGNvdW50KTsgfQogICAgc3RhdGljIHNpemVfdCBjb3VudDsKfTsKc2l6ZV90IEZhY3RvcnlfZmlndXJlczo6Y291bnQ9MDsKIAp0ZW1wbGF0ZTxjbGFzcyBUPnN0cnVjdCBGaWd1cmUKewogICAgRmlndXJlKGNvbnN0IFQmIHNyYyA9IEZhY3RvcnlfZmlndXJlcygpICl7fQp9OwogCmludCBtYWluKCkKewogICAgRmlndXJlPFF1YWQ+IGYxOwogICAgRmlndXJlPFF1YWQ+IGYyOwogICAgRmlndXJlPFF1YWQ+IGYzOwogICAgRmlndXJlPFJlY3Q+IGY0OwogICAgRmlndXJlPFJlY3Q+IGY1OwogICAgcmV0dXJuIDA7Cn0=