This is the mail archive of the
libstdc++@gcc.gnu.org
mailing list for the libstdc++ project.
Re: [libstdc++ patch] TR1 reference_wrapper invocation, base classes
- From: Douglas Paul Gregor <dgregor at cs dot indiana dot edu>
- To: gcc-patches at gcc dot gnu dot org
- Cc: libstdc++ <libstdc++ at gcc dot gnu dot org>
- Date: Wed, 02 Mar 2005 09:20:06 -0500
- Subject: Re: [libstdc++ patch] TR1 reference_wrapper invocation, base classes
- References: <200502281008.10879.doug.gregor@gmail.com>
I've committed this patch, and the patch it depends on, to mainline and
the 4.0 branch.
Doug
Douglas Gregor wrote:
This patch adds support for reference_wrapper invocation and introduces the
right base classes and typedefs for reference_wrapper. It builds on (but does
not include) the result_of patch I sent previously
(http://gcc.gnu.org/ml/libstdc++/2005-02/msg00250.html) and fixes one bug in
that patch: result_of did not do the right thing for member data pointers,
but now it does.
The repetition code in tr1/functional that includes tr1/functional_iterate.h
many times has been moved into tr1/repeat.h, because it is needed for files
other than tr1/functional_iterate.h; you now define a macro
(_GLIBCXX_REPEAT_HEADER) and include tr1/repeat.h when you need to repeat
code.
There is a _lot_ of metaprogramming in this patch; much more so than I had
expected, and that makes the code a little bit hairy. There are two major
complicating factors:
(1) reference_wrapper<T> derives from unary_function and/or binary_function
when possible. This happens when the type T is a free or member function
pointer, function type, or class type derived from unary_function and/or
binary_function. I've tried to document all of the metaprogramming I had to
do to get those right, and included the tricky test cases I could think of.
(2) reference_wrapper<T>::operator() has to deal with invoking member
pointers (by wrapping in mem_fn), function objects, and function references.
There is some SFINAE/enable_if magic in the __invoke function to decide
between these options.
There are a few other trivial changes:
- Shortened long lines
- Fixed typos and an incorrect e-mail address in some headers/tests
Tested on i686-pc-linux-gnu with no failures. ChangeLog below.