#include <iostream>
#include <string>
#include <cstdlib>
#define P(x) std::cout<<x<<std::endl
struct Variable { void test() { P("variable"); } };
struct Scalar : public Variable { void test() { P("scalar"); } };
struct Array : public Variable { void test() { P("array"); } };
Variable && get(char query)
{
switch(query)
{
case '$': return std::move(Scalar());
case '@': return std::move(Array());
default: throw 1;
}
}
int main()
{
Scalar a = (Scalar&&)get('$');
Array b = (Array&&)get('@');
a.test();
b.test();
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8Y3N0ZGxpYj4KI2RlZmluZSBQKHgpIHN0ZDo6Y291dDw8eDw8c3RkOjplbmRsCgpzdHJ1Y3QgVmFyaWFibGUgICAgICAgICAgICAgICAgICB7IHZvaWQgdGVzdCgpIHsgUCgidmFyaWFibGUiKTsgfSB9OwpzdHJ1Y3QgU2NhbGFyIDogcHVibGljIFZhcmlhYmxlICB7IHZvaWQgdGVzdCgpIHsgUCgic2NhbGFyIik7ICAgfSB9OwpzdHJ1Y3QgQXJyYXkgIDogcHVibGljIFZhcmlhYmxlICB7IHZvaWQgdGVzdCgpIHsgUCgiYXJyYXkiKTsgICAgfSB9OwoKVmFyaWFibGUgJiYgZ2V0KGNoYXIgcXVlcnkpCnsKCXN3aXRjaChxdWVyeSkKCXsKCQljYXNlICckJzogcmV0dXJuIHN0ZDo6bW92ZShTY2FsYXIoKSk7CgkJY2FzZSAnQCc6IHJldHVybiBzdGQ6Om1vdmUoQXJyYXkoKSk7CgkJCgkJZGVmYXVsdDogdGhyb3cgMTsKCX0KfQoKaW50IG1haW4oKQp7CglTY2FsYXIgYSA9IChTY2FsYXImJilnZXQoJyQnKTsKCUFycmF5ICBiID0gKEFycmF5JiYpZ2V0KCdAJyk7CgkKCWEudGVzdCgpOwoJYi50ZXN0KCk7Cn0=