#include <iostream>
#include <string>
#include <memory>
#include <vector>
struct IFactory {
typedef std::shared_ptr<IFactory> SharedFactory;
virtual std::string Name() { return "IFactory"; }
/** /
template<class... Arg>
SharedFactory Dup(const Arg&... A) {
return std::make_shared<decltype(*this)>(A...);
}
/**/
SharedFactory Dup() {
using T = decltype(*this);//なんでこれが参照型になるんじゃーーーーーー!!!
T Y=*this;
//auto R = std::make_shared<>();
//return R;
return{};
}
};
class A :public IFactory {
std::string Name() { return "A"; }
bool Say() { std::cout << "Baw" << std::endl; }
};
class B :public IFactory {
std::string Name() { return "B"; }
bool Say() { std::cout << "Maw" << std::endl; }
};
typedef std::vector<IFactory::SharedFactory> FType;
FType MakeVector() {
FType F = { std::make_shared<A>() ,std::make_shared<B>() };
return F;
}
int main() {
FType F = MakeVector();
auto A = F[0]->Dup();
std::cout << A->Name() << std::endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8bWVtb3J5PgojaW5jbHVkZSA8dmVjdG9yPgoKc3RydWN0IElGYWN0b3J5IHsKCXR5cGVkZWYgc3RkOjpzaGFyZWRfcHRyPElGYWN0b3J5PiBTaGFyZWRGYWN0b3J5OwoJdmlydHVhbCBzdGQ6OnN0cmluZyBOYW1lKCkgeyByZXR1cm4gIklGYWN0b3J5IjsgfQoJLyoqIC8KCXRlbXBsYXRlPGNsYXNzLi4uIEFyZz4KCVNoYXJlZEZhY3RvcnkgRHVwKGNvbnN0IEFyZyYuLi4gQSkgewoJCXJldHVybiBzdGQ6Om1ha2Vfc2hhcmVkPGRlY2x0eXBlKCp0aGlzKT4oQS4uLik7Cgl9CgkvKiovCglTaGFyZWRGYWN0b3J5IER1cCgpIHsKCgkJdXNpbmcgVCA9IGRlY2x0eXBlKCp0aGlzKTsvL+OBquOCk+OBp+OBk+OCjOOBjOWPgueFp+Wei+OBq+OBquOCi+OCk+OBmOOCg+ODvOODvOODvOODvOODvOODvO+8ge+8ge+8gQoJCVQgWT0qdGhpczsKCgkJLy9hdXRvIFIgPSBzdGQ6Om1ha2Vfc2hhcmVkPD4oKTsKCQkvL3JldHVybiBSOwoJCXJldHVybnt9OwoJfQp9OwoKY2xhc3MgQSA6cHVibGljIElGYWN0b3J5IHsKCXN0ZDo6c3RyaW5nIE5hbWUoKSB7IHJldHVybiAiQSI7IH0KCWJvb2wgU2F5KCkgeyBzdGQ6OmNvdXQgPDwgIkJhdyIgPDwgc3RkOjplbmRsOyB9Cn07CgpjbGFzcyBCIDpwdWJsaWMgSUZhY3RvcnkgewoJc3RkOjpzdHJpbmcgTmFtZSgpIHsgcmV0dXJuICJCIjsgfQoJYm9vbCBTYXkoKSB7IHN0ZDo6Y291dCA8PCAiTWF3IiA8PCBzdGQ6OmVuZGw7IH0KfTsKCnR5cGVkZWYgc3RkOjp2ZWN0b3I8SUZhY3Rvcnk6OlNoYXJlZEZhY3Rvcnk+IEZUeXBlOwoKRlR5cGUgTWFrZVZlY3RvcigpIHsKCUZUeXBlIEYgPSB7IHN0ZDo6bWFrZV9zaGFyZWQ8QT4oKSAsc3RkOjptYWtlX3NoYXJlZDxCPigpIH07CgoJcmV0dXJuIEY7Cn0KCmludCBtYWluKCkgewoJRlR5cGUgRiA9IE1ha2VWZWN0b3IoKTsKCglhdXRvIEEgPSBGWzBdLT5EdXAoKTsKCglzdGQ6OmNvdXQgPDwgQS0+TmFtZSgpIDw8IHN0ZDo6ZW5kbDsKCglyZXR1cm4gMDsKfQ==