#include <iostream>
#include <memory>
#include <cstdlib>
#include <ctime>
using namespace std;
struct IFoo {
virtual void foo() const = 0;
};
struct FooA : public IFoo {
void foo() const {cout << "FooA::foo()\n";}
};
struct FooB : public IFoo {
void foo() const {cout << "FooB::foo()\n";}
};
enum FOO_TYPE
{
FOO_A, FOO_B
};
std::unique_ptr<IFoo> get_a_foo()
{
using ptr_type = std::unique_ptr<IFoo>;
switch (std::rand() % 2)
{
case FOO_A: return ptr_type(new FooA);
case FOO_B: return ptr_type(new FooB);
// or, if your compiler supports the C++14 [i]make_unique[/i]:
// case FOO_A: return make_unique<FooA>();
// case FOO_B: return make_unique<FooB>();
default: return nullptr;
}
}
int main(int argc, char **args)
{
std::srand(std::time(0));
for (unsigned i = 0; i < 10; ++i)
{
auto foo_thing = get_a_foo();
foo_thing->foo();
std::cout << '\n';
}
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWVtb3J5PgojaW5jbHVkZSA8Y3N0ZGxpYj4KI2luY2x1ZGUgPGN0aW1lPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnN0cnVjdCBJRm9vIHsKICAgIHZpcnR1YWwgdm9pZCBmb28oKSBjb25zdCA9IDA7Cn07CgpzdHJ1Y3QgRm9vQSA6IHB1YmxpYyBJRm9vIHsKICAgIHZvaWQgZm9vKCkgY29uc3Qge2NvdXQgPDwgIkZvb0E6OmZvbygpXG4iO30KfTsKCnN0cnVjdCBGb29CIDogcHVibGljIElGb28gewogICAgdm9pZCBmb28oKSBjb25zdCB7Y291dCA8PCAiRm9vQjo6Zm9vKClcbiI7fQp9OwoKZW51bSBGT09fVFlQRQp7CiAgICBGT09fQSwgRk9PX0IKfTsKCnN0ZDo6dW5pcXVlX3B0cjxJRm9vPiBnZXRfYV9mb28oKQp7CiAgICB1c2luZyBwdHJfdHlwZSA9IHN0ZDo6dW5pcXVlX3B0cjxJRm9vPjsKCiAgICBzd2l0Y2ggKHN0ZDo6cmFuZCgpICUgMikKICAgIHsKICAgIGNhc2UgRk9PX0E6IHJldHVybiBwdHJfdHlwZShuZXcgRm9vQSk7CiAgICBjYXNlIEZPT19COiByZXR1cm4gcHRyX3R5cGUobmV3IEZvb0IpOwoKICAgIC8vIG9yLCBpZiB5b3VyIGNvbXBpbGVyIHN1cHBvcnRzIHRoZSBDKysxNCBbaV1tYWtlX3VuaXF1ZVsvaV06CiAgICAvLyBjYXNlIEZPT19BOiByZXR1cm4gbWFrZV91bmlxdWU8Rm9vQT4oKTsKICAgIC8vIGNhc2UgRk9PX0I6IHJldHVybiBtYWtlX3VuaXF1ZTxGb29CPigpOwogICAgZGVmYXVsdDogcmV0dXJuIG51bGxwdHI7CiAgICB9Cn0KCmludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJncykKewogICAgc3RkOjpzcmFuZChzdGQ6OnRpbWUoMCkpOwoKICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCAxMDsgKytpKQogICAgewogICAgICAgIGF1dG8gZm9vX3RoaW5nID0gZ2V0X2FfZm9vKCk7CgogICAgICAgIGZvb190aGluZy0+Zm9vKCk7CiAgICAgICAgc3RkOjpjb3V0IDw8ICdcbic7CiAgICB9Cn0=