Re: Overloading Subscript operator
raan wrote:
What I am trying to achieve here is depicted in the small program
below.
// Wrapit.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <map>
#include <list>
using namespace std;
class A
{
private:
string a;
string b;
string c;
public:
A(){}
};
class B
{
private:
string a;
string b;
string c;
public:
B(){cout << "B constructor is being called \n";}
};
class C
{
private:
map<string, A *> aobj;
map<string, B *> bobj;
public:
C(){cout << "Constructor of C called \n";}
template <class T>
T& operator [] (string key)
{
cout << "Operator [] called \n";
return new A(); //if the key has a particular text in it return
new A
// otherwise return new B();
}
};
int _tmain(int argc, _TCHAR* argv[])
{
C c;
c["abcd"] = new A();
c["efgh"] = new B();
return 0;
}
Obviously the above program will give you compiler errors.
I am trying to put a wrapper around the maps. And the insertion to the
maps is done through an
(eg . c["abcd"] = new A()) overloaded [] operator. Further I want to
use just one [] version of the function, but inside I will determine
whether I should return a new A() or a new B(). The string I recieved
as argument will have enough information for me to decide which object
to be returned. How would i do it.
My environment: VS2003 on Windows XP.
All your helps appreciated
There are a couple issues with your code:
1) assuming your [] operator works, the return type is a temporary const
T & that cannot be assignee.
2) it's awkward to really tell the compiler to pick up the template
argument, check the following code:
#include <map>
#include <list>
#include <iostream>
using namespace std;
class A
{
private:
string a;
string b;
string c;
public:
A(){}
};
class B
{
private:
string a;
string b;
string c;
public:
B(){cout << "B constructor is being called \n";}
};
class C
{
private:
map<string, A *> aobj;
map<string, B *> bobj;
public:
C(){cout << "Constructor of C called \n";}
template <class T>
T* at (string key)
{
cout << "Operator [] called \n";
return new A(); //if the key has a particular text in it returnnew A
// otherwise return new B();
}
template <class T>
T* operator [] (string key)
{
cout << "Operator [] called \n";
return new A(); //if the key has a particular text in it returnnew A
// otherwise return new B();
}
};
#define _tmain main
#define _TCHAR char
int _tmain(int argc, _TCHAR* argv[])
{
C c;
A* a = c.at<A>("abcd");
A* aa = c.operator[]<A>("abcd");
// c.get<B>["efgh"] = new B();
return 0;
}