|
Boost : |
Subject: Re: [boost] [result_of] Usage guidelines
From: Andrey Semashev (andrey.semashev_at_[hidden])
Date: 2012-09-08 09:59:01
On Tuesday 04 September 2012 11:07:39 you wrote:
>
> Jeffrey have suggested a good solution in his reply. I think it can be
> described in the result_of docs to resolve the confusion in the future. I
> can update the docs if noone objects.
I've added a clarification note to the result_of docs in trunk. Here is the
added section:
<quote>
The result template must be specialized for every valid calling signature of
the function object. If the operator() accepts arguments by (possibly const)
reference and/or is const qualified, the result specialization must take this
into account. Type traits and more generic specializations may help to reduce
the number of result specializations. This way result_of users will be able to
specify argument types exactly according to the function object call
expression. For example:
struct functor {
template<class> struct result;
// Use template parameter F to match the function object. This will
allow result deduction for both const and non-const functor.
template<class F, class T>
struct result<F(T)> {
// When argument type is matched like above, remember that the
type may be a (const-qualified) reference.
// Use type traits to transform the argument type.
typedef typename remove_cv<typename
remove_reference<T>::type>::type argument_type;
typedef argument_type type;
};
// The operator can be called on both const and non-const functor. The
argument can be lvalue or rvalue.
template<class T>
T operator()(T const& x) const
{
return x;
}
};
// All following result_of uses are valid and result in int
typedef boost::result_of< functor(int) >::type type1; // the argument is
rvalue
functor f;
type1 r1 = f(10);
typedef boost::result_of< const functor(int) >::type type2; // the
function object is const
const functor cf;
type2 r2 = cf(10);
typedef boost::result_of< functor(int&) >::type type3; // the argument is
lvalue
int a = 10;
type3 r3 = f(a);
typedef boost::result_of< functor(int const&) >::type type4; // the
argument is const lvalue
const int ca = 10;
type4 r4 = f(ca);
</quote>
You can find the complete page tere:
http://svn.boost.org/svn/boost/trunk/libs/utility/utility.htm
If noone objects I will merge it to release branch in a few days.
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk