Re: Perl style hash
On 10 Sep., 07:45, none <n...@none.none> wrote:
Sam wrote:
So? This calls for an overloaded Anything::operator=():
class Anything {
public:
// ..
Anything &operator=(double);
Anything &operator=(int);
Anything &operator=(std::string);
};
Okee-dokee.
And even if you could, you still wouldn't have the perl-style
behavior that I described. If you tried:
x["root"]["branch"]["leaf"] = 5;
the compiler would not know how to resolve the second (and third) set
of braces.
Of course it would. It's merely a matter of implementing operator[]()
accordingly.
I like the simplicity of this approach. The way I'm doing it now, I'll
have to add an iterator class to my wrapper, etc, which stinks. Your w=
ay,
I'd just be using std::map directly.
But I still don't quite see how the second and third sets of [] would wor=
k.
The first one, x["root"], is going to return an Antyhing&. So, class
Anything would have to also have a [] operator. How would the returned
Anything object access "x", which would be of type std::map?- Zitierten T=
ext ausblenden -
Try this:
#include <map>
#include <string>
#include <iostream>
#include <boost\any.hpp>
class CHashMapNode
{
private:
typedef std::map<std::string, CHashMapNode*> TNodeType;
TNodeType m_Node;
boost::any m_Value;
public:
CHashMapNode& operator[] (const char* KeyName)
{
// Look up the key in our map. If it doesn't exist, create one.
CHashMapNode*& NewNode = m_Node[std::string (KeyName)];
if (!NewNode)
NewNode = new CHashMapNode;
return *NewNode;
}
CHashMapNode& operator= (const boost::any& p_NewValue)
{
m_Value = p_NewValue;
return *this;
}
boost::any GetValue () const
{
return m_Value;
}
};
int main(int argc, char* argv[])
{
CHashMapNode HashMap;
HashMap["Root"]["Subnode"] = 3;
std::cout << boost::any_cast<int>
(HashMap["Root"]["Subnode"].GetValue ());
HashMap["Root"]["Subnode"] = std::string ("Hello World");
std::cout << boost::any_cast<std::string>
(HashMap["Root"]["Subnode"].GetValue ());
return 0;
}
Regards,
Stuart