Polymorphic containers
Hi all,
What is a good way to achieve polymorphic containers (I want to store
pointers anyway) in C++?
Rather than explain i mean I thought it best to provide a code example
of what i mean to do. This is not a motivating example but a
demonstration of what I am trying to achieve.
Is the reinterpret_cast below safe on all platforms?
I think it might not be in the generic case, though it seems to work
fine for my current tests.
Things that I worry might break this include:
* Specialisations of std::map different for the various pointer types
(which is not going to be in this code)
* The memory addresses for child/parent types of the same node differ
(I think this is only possible with multiple inheritance or virtual
inheritance right?)
Eithre way it stikes me as a horrible way to do this which might break
things in the genric case. Is there any good solution to this problem?
I thought about defining a custom iterator, but I would prefer to
return a std::map reference instead of a custom iterator.
#include <iostream>
#include <map>
#include <string>
struct SpecificNode1;
struct SpecificNode2;
struct Node
{
virtual ~Node(){}
std::map<std::string, Node*> children;
};
struct SpecificNode1 : public Node
{
std::map<std::string, SpecificNode2*>& Children() {return
reinterpret_cast<std::map<std::string, SpecificNode2*>& >(children); }
};
struct SpecificNode2 : public Node {};
int main()
{
SpecificNode1 node;
node.children.insert(std::pair<std::string, Node*>("blah", new
SpecificNode2()));
std::cerr << "Map as SpeicifcNode2" << std::endl;
for (std::map<std::string, SpecificNode2*>::iterator it =
node.Children().begin(); it != node.Children().end(); ++it)
{
std::cout << "Key: " << it->first << ", Value: " << (void*)it-
second << std::endl;
}
std::cerr << "Map as Node" << std::endl;
for (std::map<std::string, Node*>::iterator it =
node.children.begin(); it != node.children.end(); ++it)
{
std::cout << "Key: " << it->first << ", Value: " << (void*)it-
second << std::endl;
}
return 0;
}
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]