Boost logo

Boost :

From: Vladimir Prus (ghost_at_[hidden])
Date: 2004-12-06 03:09:26


Hi Roland,

> As a byproduct of my current work I factored out a small utility
> library that implements a virtual constructor.

> // create the type map
> TYPE_MAP(shape);
> // square with default constructor
> TYPE_REGISTER(shape, square);
> // circle with custom constructor taking a double parameter
> TYPE_REGISTER1(shape, circle, double);
> // circle with default constructor
> TYPE_REGISTER(shape, circle);
>
> int main(int argc, char* argv[])
> {
> std::string type;
> type = "square";
> shape* ps1 = dynamic_new<shape>(type);
> shape* ps2 = dynamic_new<shape>("circle", 20.0);

What if I write:

     shape* ps2 = dynamic_new<shape>("circle", 20);

?
I tried to create virtual construct functionality for a future Boost.Plugin
library and it worked like this:

   namespace boost { namespace plugin {
   template<>
   struct virtual_constructors<Weapon> {
       typedef mpl::list<mpl::list<std::string>,
                         mpl::list<std::string, int>
> type;
   };
   }}

Given those declaration, instantiaton of boost::plugin_factory<Weapon> will
have a 'get' method for each listed constructor signature, and usual
overload resolution will work. The disadvantage is that you need to
explicitly instantiate 'virtual_construct', but then you get static
checking. For example, a plugin can't forget to define a required
constructor.

I also considered this syntax:
   struct virtual_constructors<Weapon> {
       typedef mpl::list<ctor (std::string),
                         ctor (std::string, int)> .....

where 'ctor' is auxillary struct, but maybe it's too smart, haven't decided
yet.

What would you say?

- Volodya


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk