/* you can hate me later for the iterator abuse */
#include <iostream>
#include <stdexcept>
#include <map>
#include <cstdio>
template<typename NameT, typename ValueT> class Map {
public:
class Proxy {
private:
Map& m;
NameT k;
friend class Map;
Proxy(Map& m, const NameT& k): m(m), k(k)
{
}
public:
operator ValueT() const
{
return m.get(k);
}
ValueT operator&() const
{
return m.get(k);
}
Proxy& operator=(const ValueT& v)
{
m.insert(k, v);
return *this;
}
};
private:
std::map<NameT, ValueT> m_realmap;
public:
Map()
{
}
Map& insert(const NameT& name, const ValueT& value)
{
m_realmap[name] = value;
return *this;
}
ValueT& get(const NameT& name)
{
return m_realmap[name];
}
Proxy operator[] (const NameT& k)
{
return Proxy(*this, k);
}
NameT operator[] (int idx)
{
int count;
typename std::map<NameT, ValueT>::const_iterator iter;
for(count=0,iter=m_realmap.begin();iter!=m_realmap.end();iter++,count++)
{
if(count == idx)
{
return iter->first;
}
}
throw std::runtime_error("out of range");
/* never reached, is undefined behaviour anyway*/
return (m_realmap.end())->first;
}
int size()
{
return m_realmap.size();
}
};
int main()
{
Map<const char*, const char*> names;
names["hello"] = "world";
names["foo"] = "bar";
for(int i=0; i<names.size(); i++)
{
printf("%s => %s\n", names[i], &names[names[i]]);
}
}