Re: Multiple operator overloading
"Daniel T." <daniel_t@earthlink.net> writes:
Andrea Crotti <andrea.crotti.0@gmail.com> wrote:
Looking on the internet looks like it's perfectly fine to overload
operators, but why then this doesn't work
--8<---------------cut here---------------start------------->8---
class Myclass
{
public:
int operator[](int index) { return 0; }
string operator[](int index) { string s = "ciao"; return s; }
};
--8<---------------cut here---------------end--------------->8---
and gives the error
--8<---------------cut here---------------start------------->8---
try.cpp:23: error: ???????std::string Myclass::operator[](int)???????? cannot be overloaded
try.cpp:22: error: with ???????int Myclass::operator[](int)????????
--8<---------------cut here---------------end--------------->8---
It would be very useful in another case (thread Globals), how otherwise
I can achieve the same result?
What result are you trying to achieve?
I want to have a map where the keys are strings and the value can be of
different types.
So that I can do
--8<---------------cut here---------------start------------->8---
for key in mapping.keys():
mapping[key] = mapping[key].fromString(value)
--8<---------------cut here---------------end--------------->8---
so that I can declare my configuration without too much code
duplication, something like
--8<---------------cut here---------------start------------->8---
IntAttr x; // attribute representing an integer
conf["num_land"] = x;
VecStrAttr y;
....
--8<---------------cut here---------------end--------------->8---
But my impression is that it's just not possible in C++.
Another option without using the template would be to just inherit
--8<---------------cut here---------------start------------->8---
class Attribute
{
protected:
string value;
public:
void setValue(string& _value) { value = _value; }
// virtual T fromString(const string&) = 0;
};
class IntAttr : public Attribute
{
public:
int fromString(const string& value) {
return atoi(value.c_str());
}
};
class Globals
{
private:
ConfigParser parser;
// maybe the key should be (char *) instead
std::map<string, Attribute> config;
public:
Globals();
Attribute& operator[](const string& idx) {
return config[idx].fromString();
}
};
--8<---------------cut here---------------end--------------->8---
but still it doesn't work because without the template fromString()
can't be defined since I don't know the type of the return value...