mirror of
https://github.com/boostorg/utility.git
synced 2025-05-09 15:04:00 +00:00
reverting [80445] which is still under discussion on the mailing list
[SVN r80452]
This commit is contained in:
parent
e8440e8855
commit
e9bbb50eb4
45
utility.htm
45
utility.htm
@ -230,51 +230,6 @@ typedef boost::result_of<
|
|||||||
>::type type; // type is int</pre>
|
>::type type; // type is int</pre>
|
||||||
</blockquote>
|
</blockquote>
|
||||||
|
|
||||||
<p>The <code>result</code> template must be specialized for every valid calling signature of the function object.
|
|
||||||
If the <code>operator()</code> accepts arguments by (possibly <code>const</code>) reference and/or is <code>const</code>
|
|
||||||
qualified, the <code>result</code> specialization must take this into account. <a href="../type_traits/doc/html/index.html">Type traits</a>
|
|
||||||
and more generic specializations may help to reduce the number of <code>result</code> specializations. This way <code>result_of</code> users
|
|
||||||
will be able to specify argument types exactly according to the function object call expression. For example:</p>
|
|
||||||
|
|
||||||
<blockquote>
|
|
||||||
<pre>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);</pre>
|
|
||||||
</blockquote>
|
|
||||||
|
|
||||||
<p>Since <code>decltype</code> is a new language
|
<p>Since <code>decltype</code> is a new language
|
||||||
feature recently standardized in C++11,
|
feature recently standardized in C++11,
|
||||||
if you are writing a function object
|
if you are writing a function object
|
||||||
|
Loading…
x
Reference in New Issue
Block a user