Boost logo

Boost :

From: Emil Dotchevski (emildotchevski_at_[hidden])
Date: 2007-06-06 22:06:48

I wrote an implementation which removes the Allocator parameter of

All tests pass on msvc 7.1, 8.0, and gcc 3.4.4 (I had to modify the
allocator test.) To try my implementation, you'll need the rest of the
boost::function files from CVS HEAD.

Allocators are supported as an argument to the following boost::function

template<typename Functor,typename Allocator>
function(Functor f, Allocator a);

A copy of the passed allocator is stored in the boost::function object, the
same way it's done in shared_ptr.


1) As in the current official boost::function implementation, the allocator
is only used if the boost::function object is initialized with a function
object which does not fit in a "small" static buffer.

2) When a function object that can not use the small object optimization is
assigned (by operator=) to an existing boost::function object, the
boost::function object will not have an allocator and will use new/delete.
To allow users to supply an allocator in an assignment operation, I added a
new member function:

template<typename Functor,typename Allocator>
void assign(Functor f, Allocator a);

Emil Dotchevski

----- Original Message -----
From: "Douglas Gregor" <doug.gregor_at_[hidden]>
To: <boost_at_[hidden]>
Sent: Tuesday, June 05, 2007 10:46 AM
Subject: Re: [boost] [function] allocator template parameter question

> On Jun 5, 2007, at 12:42 PM, Emil Dotchevski wrote:
>>> On Jun 4, 2007, at 10:57 PM, Emil Dotchevski wrote:> > One
>>> important advantage of using boost::function is that it acts > >
>>> like a> > function pointer, reducing physical coupling between
>>> compilation > > units. This> > is very much like shared_ptr.> >> >
>>> A nice feature of shared_ptr is that it has a single template > >
>>> parameter, T,> > even though diferent instances of shared_ptr<T>
>>> can use different> > allocators.> >> > When using boost::function,
>>> one can also provide an allocator, but > > unlike> > shared_ptr,
>>> the allocator is a default parameter of the > > boost::function> >
>>> class template.> > > Is there a reason why this is necessary?
>>> Can't boost::function use > > similar> > technique to the one
>>> employed by shared_ptr to avoid the need for this> > second
>>> template parameter?> > You know, I never even thought about adding
>>> it. I didn't know about > the shared_ptr technique when I put the
>>> allocator into > boost::function, and after the C++ committee
>>> removed the allocator I > didn't think about it any more.
>> Perhaps if the allocator it's moved to the constructor, the
>> committee would accept it? :)
> Since shared_ptr already has this functionality in its constructor,
> they may accept it. You could certainly write a short proposal to the
> C++ committee...
>>> <snip>> I don't know when I would have time to implement this,
>>> although I > would certainly consider adding this functionality to
>>> Boost's > "function". Might you be interested in implementing it?
>> OK, I'll give it a shot, and I'll let you know how it goes.
> Great!
> - Doug
> _______________________________________________
> Unsubscribe & other changes:

Boost list run by bdawes at, gregod at, cpdaniel at, john at