#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"; }
};
const Quad*const quad = 0l;
const Rect*const rect = 0l;
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;
struct Figure
{
template<class T> Figure(T* tmp, const T& src = Factory_figures() ){}
};
int main()
{
Figure f1(quad);
Figure f2(quad);
Figure f3(quad);
Figure f4(quad);
Figure f5(rect);
Figure f6(rect);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKc3RydWN0IFF1YWQKewogICAgUXVhZChjb25zdCBzaXplX3Qgc2lkZSl7IHN0ZDo6Y291dDw8ICJidWlsZCBxdWFkOiAiPDxzaWRlPDwiXG4iOyB9Cn07CgpzdHJ1Y3QgUmVjdAp7CiAgICBSZWN0KGNvbnN0IHNpemVfdCB3LGNvbnN0IHNpemVfdCBoKXsgc3RkOjpjb3V0PDwgImJ1aWxkIHJlY3Q6ICI8PHc8PCIgOiAiPDxoPDwiXG4iOyB9Cn07CmNvbnN0IFF1YWQqY29uc3QgIHF1YWQgPSAwbDsKY29uc3QgUmVjdCpjb25zdCAgcmVjdCA9IDBsOwoKCnN0cnVjdCBGYWN0b3J5X2ZpZ3VyZXMgCnsKICAgIEZhY3RvcnlfZmlndXJlcygpeyBjb3VudCArPTEwOyB9CgogICAgb3BlcmF0b3IgUXVhZCgpIHsgcmV0dXJuIFF1YWQoY291bnQpOyB9CiAgICBvcGVyYXRvciBSZWN0KCkgeyByZXR1cm4gUmVjdChjb3VudCxjb3VudCk7IH0KICAgIHN0YXRpYyBzaXplX3QgY291bnQ7Cn07CnNpemVfdCBGYWN0b3J5X2ZpZ3VyZXM6OmNvdW50PTA7CgpzdHJ1Y3QgRmlndXJlCnsKICAgIHRlbXBsYXRlPGNsYXNzIFQ+IEZpZ3VyZShUKiB0bXAsIGNvbnN0IFQmIHNyYyA9ICBGYWN0b3J5X2ZpZ3VyZXMoKSApe30KfTsKCgppbnQgbWFpbigpCnsKICAgIEZpZ3VyZSBmMShxdWFkKTsKICAgIEZpZ3VyZSBmMihxdWFkKTsKICAgIEZpZ3VyZSBmMyhxdWFkKTsKICAgIEZpZ3VyZSBmNChxdWFkKTsKICAgIEZpZ3VyZSBmNShyZWN0KTsKICAgIEZpZ3VyZSBmNihyZWN0KTsKICAgIHJldHVybiAwOwp9