
On Mon, 06 Dec 2004 08:41:40 +0100, Roland Schwarz wrote
Jeff Garland wrote:
I'm interested in seeing something like this in boost...
Question -- will this compile in your implementation?
square* ps4 = dynamic_new<square>("square", 10.0);
as well as:
shape* ps4 = dynamic_new<shape>("square", 10.0);
Well this depends on which types you have registered. In
square* ps4 = dynamic_new<square>("square", 10.0);
you are assuming a different base class than shape, and to this end you also would need to "declare" TYPE_MAP(square); too.
Ok.
But I admit since I only posted a small example to find out the level of interest I did not put much effort to explain my rationale and the possible range of usages.
It goes something along this: To call a function of an object you need its interface. I use an (not necessarily) abstract base class to describe it. I use the covariant return types feature of C++ to return pointers to derived classes from a creator function.
So the pattern of usage is:
baseclass* p = dynamic_new<baseclass>("derivedclass");
if the dynamic new cannot perform the requested operation at runtime it return a 0 - pointer instead. If succesfull p points to the derived class. To make it the exakt derived class, you need to cast it of course.
derivedclass* p = (derivedclass*) dynamic_new<baseclass>("derivedclass");
But this of course is not of much use, since it is easier then to call
derivedclass* p = new derivedclass;
since you already know everything that is needed to create the object.
I was asking because I was curious if the construction idiom based on string could be applied consistently throughout an application even if in some places in the code I had exact knowledge and hence wouldn't be constructing a base class pointer. My interpretation of the above is that in this case I have to drop back to doing a regular constructor because the virtual constructor doesn't handle this elegantly.... Jeff