Greetings all,

I'm writing to see if there is interest in a little library I wrote a while back that provides virtual constructor semantics by allowing constructors to be represented as function objects. I've took an initial shot at boostifing the code (although the documentation needs a little work). I think it would go along nicely with the pre-existing boost::mem_fn() library (either as part of or as a compliment). I've include a link to the library and also a quick snippet of it's usage:

http://aliguori.dyndns.org/boost/ctor_fn.html

<-- From the docs -->
To use the ctor_fn library, you simply pass the signature of the constructor you want to receive an object for (as a function type) as the first template argument to the ctor_fn function. An optional second template argument can specify an STL compliant allocator class. The following is an example usage:


struct A { /* ... */ };

   using boost::function;
   using boost::ctor_fn;

   function<A *(const A &)> a_copy = ctor_fn<A *(const A &)>();
   A a;

/* initialize a */

A *copy_of_a = a_copy(a)

The initial assignment can also do some more fancy things:

using boost::smart_ptr;

function<smart_ptr<A> (const A &)> safe_a_copy = ctor_fn<A *(const A &)>();

safe_a_copy(a); // no fears of memory leaks now

<-- end snip -->

As a quick aside, this library would make implementing a factory pattern incredible easy. One could do something as simple as (assuming two classes where B inherents from A):

   template <typename BaseSig>
   struct factory
   {
       typedef std::map<std::string, boost::function<BaseSig> > concrete;
   };

factory<boost::smart_ptr<A> (Widget &a)>::concrete a_factory;

a_factory["B"] = boost::ctor_fn<B *(Widget &)>();

And of course, my favorite example:

a_factory["B"] = boost::bind(boost::ctor_fn<B *(Widget &, int)>(), _1, 45);

This is not a formal submission, I just wanted to see if there's interest in this before I went through and boostified the documentation. Also, I've only tested the library on GCC-3.x...

Regards,
Anthony Liguori

_______________________________________________
Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost

Reply via email to