#include <iostream>
#include <string>
#include <vector>
using namespace std;
class YObject {
const string m_name;
public:
YObject(const string& name) : m_name(name) {}
virtual const string& getName() { return m_name; }
};
class UIButton : public YObject {
public:
UIButton(const string& name) : YObject(name) {}
};
class ObjectType : public YObject {
public:
ObjectType(const string& name) : YObject(name) {}
};
vector<YObject*> foo;
template <typename T>
T* object_of() {
T* result = nullptr;
for (auto& i : foo) {
T* bar = dynamic_cast<T*>(i);
if (bar != nullptr) {
result = bar;
}
}
return result;
}
int main() {
foo.push_back(new UIButton("1"));
foo.push_back(new ObjectType("2"));
foo.push_back(new UIButton("3"));
cout << object_of<UIButton>()->getName() << endl;
cout << object_of<ObjectType>()->getName() << endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8dmVjdG9yPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY2xhc3MgWU9iamVjdCB7Cgljb25zdCBzdHJpbmcgbV9uYW1lOwpwdWJsaWM6CglZT2JqZWN0KGNvbnN0IHN0cmluZyYgbmFtZSkgOiBtX25hbWUobmFtZSkge30KCXZpcnR1YWwgY29uc3Qgc3RyaW5nJiBnZXROYW1lKCkgeyByZXR1cm4gbV9uYW1lOyB9Cn07CgpjbGFzcyBVSUJ1dHRvbiA6IHB1YmxpYyBZT2JqZWN0IHsKcHVibGljOgoJVUlCdXR0b24oY29uc3Qgc3RyaW5nJiBuYW1lKSA6IFlPYmplY3QobmFtZSkge30KfTsKCmNsYXNzIE9iamVjdFR5cGUgOiBwdWJsaWMgWU9iamVjdCB7CnB1YmxpYzoKCU9iamVjdFR5cGUoY29uc3Qgc3RyaW5nJiBuYW1lKSA6IFlPYmplY3QobmFtZSkge30KfTsKCnZlY3RvcjxZT2JqZWN0Kj4gZm9vOwoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+ClQqIG9iamVjdF9vZigpIHsKCVQqIHJlc3VsdCA9IG51bGxwdHI7CgoJZm9yIChhdXRvJiBpIDogZm9vKSB7CgkJVCogYmFyID0gZHluYW1pY19jYXN0PFQqPihpKTsKCgkJaWYgKGJhciAhPSBudWxscHRyKSB7CgkJCXJlc3VsdCA9IGJhcjsKCQl9Cgl9CglyZXR1cm4gcmVzdWx0Owp9CgppbnQgbWFpbigpIHsKCWZvby5wdXNoX2JhY2sobmV3IFVJQnV0dG9uKCIxIikpOwoJZm9vLnB1c2hfYmFjayhuZXcgT2JqZWN0VHlwZSgiMiIpKTsKCWZvby5wdXNoX2JhY2sobmV3IFVJQnV0dG9uKCIzIikpOwoKCWNvdXQgPDwgb2JqZWN0X29mPFVJQnV0dG9uPigpLT5nZXROYW1lKCkgPDwgZW5kbDsKCWNvdXQgPDwgb2JqZWN0X29mPE9iamVjdFR5cGU+KCktPmdldE5hbWUoKSA8PCBlbmRsOwoKCXJldHVybiAwOwp9