/** Linked Lists in C++
** @author Muhammad Ahmad Tirmazi
**/
#include <string>
#include <iostream>
#include <vector>
#include <typeinfo>
using namespace std;
struct element
{
element(void* obj, std::type_info const* t): object(obj), type(t) {}
void* object;
std::type_info const* type;
};
class linked_list
{
std::vector< element* > stack;
public:
linked_list() {}
virtual ~linked_list() {}
template<typename T> void add_element(T* obj)
{
void* v_obj = static_cast< void* >( obj );
stack.push_back( new element( v_obj, &typeid(obj) ) );
}
template < typename T > T* get_element( int index )
{
if ( *stack[index]->type == typeid(T*) )
{
return static_cast<T*>( stack[index]->object );
}
else throw 1;
}
};
int main()
{
linked_list list;
int i = 5;
cout << i << endl;
list.add_element( &i );
list.add_element( new string("Hello!") );
try{
int* j = list.get_element<int>(0);
cout << *j << endl;
cout << *list.get_element<string>(1) << endl;
} catch(...){ cout << "ERROR!" << endl; }
}
LyoqIExpbmtlZCBMaXN0cyBpbiBDKysKKiogIEBhdXRob3IgTXVoYW1tYWQgQWhtYWQgVGlybWF6aQoqKi8KCiNpbmNsdWRlIDxzdHJpbmc+CiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPHR5cGVpbmZvPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnN0cnVjdCBlbGVtZW50CnsKCWVsZW1lbnQodm9pZCogb2JqLCBzdGQ6OnR5cGVfaW5mbyBjb25zdCogdCk6IG9iamVjdChvYmopLCB0eXBlKHQpIHt9Cgl2b2lkKiBvYmplY3Q7CglzdGQ6OnR5cGVfaW5mbyBjb25zdCogdHlwZTsKfTsKCmNsYXNzIGxpbmtlZF9saXN0CnsKCXN0ZDo6dmVjdG9yPCBlbGVtZW50KiA+IHN0YWNrOwpwdWJsaWM6CglsaW5rZWRfbGlzdCgpIHt9Cgl2aXJ0dWFsIH5saW5rZWRfbGlzdCgpIHt9CgkKCXRlbXBsYXRlPHR5cGVuYW1lIFQ+IHZvaWQgYWRkX2VsZW1lbnQoVCogb2JqKQoJewoJCXZvaWQqIHZfb2JqID0gc3RhdGljX2Nhc3Q8IHZvaWQqID4oIG9iaiApOwoJCXN0YWNrLnB1c2hfYmFjayggbmV3IGVsZW1lbnQoIHZfb2JqLCAmdHlwZWlkKG9iaikgKSApOwoJfQoJCgl0ZW1wbGF0ZSA8IHR5cGVuYW1lIFQgPiBUKiBnZXRfZWxlbWVudCggaW50IGluZGV4ICkKCXsKCQlpZiAoICpzdGFja1tpbmRleF0tPnR5cGUgPT0gdHlwZWlkKFQqKSApCgkJewoJCQlyZXR1cm4gc3RhdGljX2Nhc3Q8VCo+KCBzdGFja1tpbmRleF0tPm9iamVjdCApOwoJCX0KCQkKCQllbHNlIHRocm93IDE7Cgl9Cn07CgppbnQgbWFpbigpCnsKCWxpbmtlZF9saXN0IGxpc3Q7CgkKCWludCBpID0gNTsKCWNvdXQgPDwgaSA8PCBlbmRsOwoJCQoJbGlzdC5hZGRfZWxlbWVudCggJmkgKTsKCWxpc3QuYWRkX2VsZW1lbnQoIG5ldyBzdHJpbmcoIkhlbGxvISIpICk7CgkKCXRyeXsKCQlpbnQqIGogPSBsaXN0LmdldF9lbGVtZW50PGludD4oMCk7CgkJY291dCA8PCAqaiA8PCBlbmRsOwoJCQoJCWNvdXQgPDwgKmxpc3QuZ2V0X2VsZW1lbnQ8c3RyaW5nPigxKSA8PCBlbmRsOwoJfSBjYXRjaCguLi4peyBjb3V0IDw8ICJFUlJPUiEiIDw8IGVuZGw7IH0KfQ==