mirror of
https://github.com/boostorg/utility.git
synced 2025-10-12 00:25:19 +02:00
Compare commits
1 Commits
boost-1.49
...
boost-1.46
Author | SHA1 | Date | |
---|---|---|---|
|
0def6ea76d |
111
enable_if.html
111
enable_if.html
@@ -21,7 +21,6 @@
|
|||||||
<BR>
|
<BR>
|
||||||
<BR>
|
<BR>
|
||||||
Copyright 2003 Jaakko Järvi, Jeremiah Willcock, Andrew Lumsdaine.<BR>
|
Copyright 2003 Jaakko Järvi, Jeremiah Willcock, Andrew Lumsdaine.<BR>
|
||||||
Copyright 2011 Matt Calabrese.<BR>
|
|
||||||
<BR>
|
<BR>
|
||||||
<!--TOC section Introduction-->
|
<!--TOC section Introduction-->
|
||||||
|
|
||||||
@@ -82,7 +81,7 @@ definitions to find this out. Instantiating the latter definition with
|
|||||||
<PRE>int::result_type negate(const int&);
|
<PRE>int::result_type negate(const int&);
|
||||||
|
|
||||||
</PRE>
|
</PRE>
|
||||||
where the return type is invalid. If this were an error, adding an unrelated function template
|
where the return type is invalid. If this was an error, adding an unrelated function template
|
||||||
(that was never called) could break otherwise valid code.
|
(that was never called) could break otherwise valid code.
|
||||||
Due to the SFINAE principle the above example is not, however, erroneous.
|
Due to the SFINAE principle the above example is not, however, erroneous.
|
||||||
The latter definition of <TT>negate</TT> is simply removed from the overload resolution set.<BR>
|
The latter definition of <TT>negate</TT> is simply removed from the overload resolution set.<BR>
|
||||||
@@ -155,7 +154,6 @@ typename enable_if<boost::is_arithmetic<T>, T>::type
|
|||||||
foo(T t) { return t; }
|
foo(T t) { return t; }
|
||||||
|
|
||||||
</PRE>
|
</PRE>
|
||||||
|
|
||||||
<!--TOC section Using <TT>enable_if</TT>-->
|
<!--TOC section Using <TT>enable_if</TT>-->
|
||||||
|
|
||||||
<H2><A NAME="htoc5">3</A> Using <TT>enable_if</TT></H2><!--SEC END -->
|
<H2><A NAME="htoc5">3</A> Using <TT>enable_if</TT></H2><!--SEC END -->
|
||||||
@@ -164,19 +162,8 @@ foo(T t) { return t; }
|
|||||||
The <TT>enable_if</TT> templates are defined in
|
The <TT>enable_if</TT> templates are defined in
|
||||||
<TT>boost/utility/enable_if.hpp</TT>, which is included by <TT>boost/utility.hpp</TT>.<BR>
|
<TT>boost/utility/enable_if.hpp</TT>, which is included by <TT>boost/utility.hpp</TT>.<BR>
|
||||||
<BR>
|
<BR>
|
||||||
With respect to function templates, <TT>enable_if</TT> can be used in multiple different ways:
|
The <TT>enable_if</TT> template can be used either as the return type, or as an
|
||||||
|
extra argument. For example, the <TT>foo</TT> function in the previous section could also be written
|
||||||
<UL>
|
|
||||||
<LI>As the return type of an instantiatied function
|
|
||||||
<LI>As an extra parameter of an instantiated function
|
|
||||||
<LI>As an extra template parameter (useful only in a compiler that supports C++0x default
|
|
||||||
arguments for function template parameters, see <A href="#sec:enable_if_0x">Enabling function
|
|
||||||
templates in C++0x</a> for details)
|
|
||||||
</UL>
|
|
||||||
|
|
||||||
In the previous section, the return type form of <TT>enable_if</TT> was shown. As an example
|
|
||||||
of using the form of <TT>enable_if</TT> that works via an extra function parameter, the
|
|
||||||
<TT>foo</TT> function in the previous section could also be written
|
|
||||||
as:
|
as:
|
||||||
<PRE>template <class T>
|
<PRE>template <class T>
|
||||||
T foo(T t, typename enable_if<boost::is_arithmetic<T> >::type* dummy = 0);
|
T foo(T t, typename enable_if<boost::is_arithmetic<T> >::type* dummy = 0);
|
||||||
@@ -186,80 +173,18 @@ a default value to keep the parameter hidden from client code.
|
|||||||
Note that the second template argument was not given to <TT>enable_if</TT>, as the default
|
Note that the second template argument was not given to <TT>enable_if</TT>, as the default
|
||||||
<TT>void</TT> gives the desired behavior.<BR>
|
<TT>void</TT> gives the desired behavior.<BR>
|
||||||
<BR>
|
<BR>
|
||||||
Which way to write the enabler is largely a matter of taste, but for certain functions, only a
|
Whether to write the enabler as an argument or within the return type is
|
||||||
subset of the options is possible:
|
largely a matter of taste, but for certain functions, only one
|
||||||
|
alternative is possible:
|
||||||
<UL><LI>
|
<UL><LI>
|
||||||
Many operators have a fixed number of arguments, thus <TT>enable_if</TT> must be used either in the
|
Operators have a fixed number of arguments, thus <TT>enable_if</TT> must be used in the return type.
|
||||||
return type or in an extra template parameter.
|
<LI>Constructors and destructors do not have a return type; an extra argument is the only option.
|
||||||
<LI>Functions that have a variadic parameter list must use either the return type form or an extra
|
<LI>There does not seem to be a way to specify an enabler for a conversion operator. Converting constructors,
|
||||||
template parameter.
|
however, can have enablers as extra default arguments.
|
||||||
<LI>Constructors do not have a return type so you must use either an extra function parameter or an
|
|
||||||
extra template parameter.
|
|
||||||
<LI>Constructors that have a variadic parameter list must an extra template parameter.
|
|
||||||
<LI>Conversion operators can only be written with an extra template parameter.
|
|
||||||
</UL>
|
</UL>
|
||||||
<!--TOC subsection Enabling function templates in C++0x-->
|
|
||||||
|
|
||||||
<A NAME="sec:enable_if_0x"></A>
|
|
||||||
<H3><A NAME="htoc7">3.1</A> Enabling function templates in C++0x</H3><!--SEC END -->
|
|
||||||
|
|
||||||
In a compiler which supports C++0x default arguments for function template parameters, you can
|
|
||||||
enable and disable function templates by adding an additional template parameter. This approach
|
|
||||||
works in all situations where you would use either the return type form of <TT>enable_if</TT> or
|
|
||||||
the function parameter form, including operators, constructors, variadic function templates, and
|
|
||||||
even overloaded conversion operations.
|
|
||||||
|
|
||||||
As an example:
|
|
||||||
|
|
||||||
<PRE>#include <boost/type_traits/is_arithmetic.hpp>
|
|
||||||
#include <boost/type_traits/is_pointer.hpp>
|
|
||||||
#include <boost/utility/enable_if.hpp>
|
|
||||||
|
|
||||||
class test
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
// A constructor that works for any argument list of size 10
|
|
||||||
template< class... T
|
|
||||||
, typename boost::enable_if_c< sizeof...( T ) == 10, int >::type = 0
|
|
||||||
>
|
|
||||||
test( T&&... );
|
|
||||||
|
|
||||||
// A conversion operation that can convert to any arithmetic type
|
|
||||||
template< class T
|
|
||||||
, typename boost::enable_if< boost::is_arithmetic< T >, int >::type = 0
|
|
||||||
>
|
|
||||||
operator T() const;
|
|
||||||
|
|
||||||
// A conversion operation that can convert to any pointer type
|
|
||||||
template< class T
|
|
||||||
, typename boost::enable_if< boost::is_pointer< T >, int >::type = 0
|
|
||||||
>
|
|
||||||
operator T() const;
|
|
||||||
};
|
|
||||||
|
|
||||||
int main()
|
|
||||||
{
|
|
||||||
// Works
|
|
||||||
test test_( 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 );
|
|
||||||
|
|
||||||
// Fails as expected
|
|
||||||
test fail_construction( 1, 2, 3, 4, 5 );
|
|
||||||
|
|
||||||
// Works by calling the conversion operator enabled for arithmetic types
|
|
||||||
int arithmetic_object = test_;
|
|
||||||
|
|
||||||
// Works by calling the conversion operator enabled for pointer types
|
|
||||||
int* pointer_object = test_;
|
|
||||||
|
|
||||||
// Fails as expected
|
|
||||||
struct {} fail_conversion = test_;
|
|
||||||
}
|
|
||||||
|
|
||||||
</PRE>
|
|
||||||
|
|
||||||
<!--TOC subsection Enabling template class specializations-->
|
<!--TOC subsection Enabling template class specializations-->
|
||||||
|
|
||||||
<H3><A NAME="htoc7">3.2</A> Enabling template class specializations</H3><!--SEC END -->
|
<H3><A NAME="htoc6">3.1</A> Enabling template class specializations</H3><!--SEC END -->
|
||||||
|
|
||||||
<A NAME="sec:enable_if_classes"></A>
|
<A NAME="sec:enable_if_classes"></A>
|
||||||
Class template specializations can be enabled or disabled with <TT>enable_if</TT>.
|
Class template specializations can be enabled or disabled with <TT>enable_if</TT>.
|
||||||
@@ -285,7 +210,7 @@ is the correct value.<BR>
|
|||||||
<BR>
|
<BR>
|
||||||
<!--TOC subsection Overlapping enabler conditions-->
|
<!--TOC subsection Overlapping enabler conditions-->
|
||||||
|
|
||||||
<H3><A NAME="htoc8">3.3</A> Overlapping enabler conditions</H3><!--SEC END -->
|
<H3><A NAME="htoc7">3.2</A> Overlapping enabler conditions</H3><!--SEC END -->
|
||||||
|
|
||||||
<A NAME="sec:overlapping_conditions"></A>
|
<A NAME="sec:overlapping_conditions"></A>
|
||||||
Once the compiler has examined the enabling conditions and included the
|
Once the compiler has examined the enabling conditions and included the
|
||||||
@@ -314,7 +239,7 @@ partial specializations as well.<BR>
|
|||||||
<BR>
|
<BR>
|
||||||
<!--TOC subsection Lazy <TT>enable_if</TT>-->
|
<!--TOC subsection Lazy <TT>enable_if</TT>-->
|
||||||
|
|
||||||
<H3><A NAME="htoc9">3.4</A> Lazy <TT>enable_if</TT></H3><!--SEC END -->
|
<H3><A NAME="htoc8">3.3</A> Lazy <TT>enable_if</TT></H3><!--SEC END -->
|
||||||
|
|
||||||
<A NAME="sec:enable_if_lazy"></A>
|
<A NAME="sec:enable_if_lazy"></A>
|
||||||
In some cases it is necessary to avoid instantiating part of a
|
In some cases it is necessary to avoid instantiating part of a
|
||||||
@@ -360,7 +285,7 @@ above example, <TT>is_multipliable<T, U>::value</TT> defines when
|
|||||||
<BR>
|
<BR>
|
||||||
<!--TOC subsection Compiler workarounds-->
|
<!--TOC subsection Compiler workarounds-->
|
||||||
|
|
||||||
<H3><A NAME="htoc10">3.5</A> Compiler workarounds</H3><!--SEC END -->
|
<H3><A NAME="htoc9">3.4</A> Compiler workarounds</H3><!--SEC END -->
|
||||||
|
|
||||||
<A NAME="sec:workarounds"></A>
|
<A NAME="sec:workarounds"></A>
|
||||||
Some compilers flag functions as ambiguous if the only distinguishing factor is a different
|
Some compilers flag functions as ambiguous if the only distinguishing factor is a different
|
||||||
@@ -442,9 +367,9 @@ David Vandevoorde and Nicolai M. Josuttis.
|
|||||||
Addison-Wesley, 2002.</DL>
|
Addison-Wesley, 2002.</DL>
|
||||||
|
|
||||||
<hr/>
|
<hr/>
|
||||||
<p>Copyright Jaakko Järvi<sup>*</sup>, Jeremiah Willcock<sup>*</sup>, Andrew Lumsdaine<sup>*</sup>, Matt Calabrese<BR>
|
<p>Copyright Jaakko Järvi, Jeremiah Willcock and Andrew Lumsdaine<BR>
|
||||||
<EM>{jajarvi|jewillco|lums}@osl.iu.edu, rivorus@gmail.com</EM><BR>
|
<EM>{jajarvi|jewillco|lums}@osl.iu.edu</EM><BR>
|
||||||
<sup>*</sup>Indiana University<BR>
|
Indiana University<BR>
|
||||||
Open Systems Lab<br/>
|
Open Systems Lab<br/>
|
||||||
Use, modification and distribution are subject to the
|
Use, modification and distribution are subject to the
|
||||||
Boost Software License, Version 1.0.
|
Boost Software License, Version 1.0.
|
||||||
@@ -461,4 +386,4 @@ or copy at <a href="http://www.boost.org/LICENSE_1_0.txt">
|
|||||||
</EM><A HREF="http://pauillac.inria.fr/~maranget/hevea/index.html"><EM>H<FONT SIZE=2><sup>E</sup></FONT>V<FONT SIZE=2><sup>E</sup></FONT>A</EM></A><EM>.
|
</EM><A HREF="http://pauillac.inria.fr/~maranget/hevea/index.html"><EM>H<FONT SIZE=2><sup>E</sup></FONT>V<FONT SIZE=2><sup>E</sup></FONT>A</EM></A><EM>.
|
||||||
</EM></BLOCKQUOTE>
|
</EM></BLOCKQUOTE>
|
||||||
</BODY>
|
</BODY>
|
||||||
</HTML>
|
</HTML>
|
@@ -28,7 +28,7 @@ namespace detail
|
|||||||
inline void current_function_helper()
|
inline void current_function_helper()
|
||||||
{
|
{
|
||||||
|
|
||||||
#if defined(__GNUC__) || (defined(__MWERKS__) && (__MWERKS__ >= 0x3000)) || (defined(__ICC) && (__ICC >= 600)) || defined(__ghs__)
|
#if defined(__GNUC__) || (defined(__MWERKS__) && (__MWERKS__ >= 0x3000)) || (defined(__ICC) && (__ICC >= 600))
|
||||||
|
|
||||||
# define BOOST_CURRENT_FUNCTION __PRETTY_FUNCTION__
|
# define BOOST_CURRENT_FUNCTION __PRETTY_FUNCTION__
|
||||||
|
|
||||||
@@ -65,4 +65,3 @@ inline void current_function_helper()
|
|||||||
} // namespace boost
|
} // namespace boost
|
||||||
|
|
||||||
#endif // #ifndef BOOST_CURRENT_FUNCTION_HPP_INCLUDED
|
#endif // #ifndef BOOST_CURRENT_FUNCTION_HPP_INCLUDED
|
||||||
|
|
||||||
|
@@ -8,8 +8,6 @@
|
|||||||
// See http://www.boost.org/libs/utility/operators.htm for documentation.
|
// See http://www.boost.org/libs/utility/operators.htm for documentation.
|
||||||
|
|
||||||
// Revision History
|
// Revision History
|
||||||
// 16 Dec 10 Limit warning suppression for 4284 to older versions of VC++
|
|
||||||
// (Matthew Bradbury, fixes #4432)
|
|
||||||
// 07 Aug 08 Added "euclidean" spelling. (Daniel Frey)
|
// 07 Aug 08 Added "euclidean" spelling. (Daniel Frey)
|
||||||
// 03 Apr 08 Make sure "convertible to bool" is sufficient
|
// 03 Apr 08 Make sure "convertible to bool" is sufficient
|
||||||
// for T::operator<, etc. (Daniel Frey)
|
// for T::operator<, etc. (Daniel Frey)
|
||||||
@@ -90,7 +88,7 @@
|
|||||||
# pragma set woff 1234
|
# pragma set woff 1234
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if BOOST_WORKAROUND(BOOST_MSVC, < 1600)
|
#if defined(BOOST_MSVC)
|
||||||
# pragma warning( disable : 4284 ) // complaint about return type of
|
# pragma warning( disable : 4284 ) // complaint about return type of
|
||||||
#endif // operator-> not begin a UDT
|
#endif // operator-> not begin a UDT
|
||||||
|
|
||||||
|
@@ -35,7 +35,10 @@ struct tr1_result_of<F(BOOST_RESULT_OF_ARGS)>
|
|||||||
|
|
||||||
#if !defined(BOOST_NO_DECLTYPE) && defined(BOOST_RESULT_OF_USE_DECLTYPE)
|
#if !defined(BOOST_NO_DECLTYPE) && defined(BOOST_RESULT_OF_USE_DECLTYPE)
|
||||||
|
|
||||||
// Uses declval following N3225 20.7.7.6 when F is not a pointer.
|
// As of N2588, C++0x result_of only supports function call
|
||||||
|
// expressions of the form f(x). This precludes support for member
|
||||||
|
// function pointers, which are invoked with expressions of the form
|
||||||
|
// o->*f(x). This implementation supports both.
|
||||||
template<typename F BOOST_PP_COMMA_IF(BOOST_PP_ITERATION())
|
template<typename F BOOST_PP_COMMA_IF(BOOST_PP_ITERATION())
|
||||||
BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(),typename T)>
|
BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(),typename T)>
|
||||||
struct result_of<F(BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(),T))>
|
struct result_of<F(BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(),T))>
|
||||||
@@ -53,15 +56,18 @@ struct result_of<F(BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(),T))>
|
|||||||
|
|
||||||
namespace detail {
|
namespace detail {
|
||||||
|
|
||||||
|
# define BOOST_RESULT_OF_STATIC_MEMBERS(z, n, _) \
|
||||||
|
static T ## n t ## n; \
|
||||||
|
/**/
|
||||||
|
|
||||||
template<typename F BOOST_PP_COMMA_IF(BOOST_PP_ITERATION())
|
template<typename F BOOST_PP_COMMA_IF(BOOST_PP_ITERATION())
|
||||||
BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(),typename T)>
|
BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(),typename T)>
|
||||||
struct cpp0x_result_of_impl<F(BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(),T))>
|
class cpp0x_result_of_impl<F(BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(),T))>
|
||||||
{
|
{
|
||||||
typedef decltype(
|
static F f;
|
||||||
boost::declval<F>()(
|
BOOST_PP_REPEAT(BOOST_PP_ITERATION(), BOOST_RESULT_OF_STATIC_MEMBERS, _)
|
||||||
BOOST_PP_ENUM_BINARY_PARAMS(BOOST_PP_ITERATION(), declval<T, >() BOOST_PP_INTERCEPT)
|
public:
|
||||||
)
|
typedef decltype(f(BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(),t))) type;
|
||||||
) type;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace detail
|
} // namespace detail
|
||||||
|
@@ -13,9 +13,7 @@
|
|||||||
#include <boost/preprocessor/iteration/iterate.hpp>
|
#include <boost/preprocessor/iteration/iterate.hpp>
|
||||||
#include <boost/preprocessor/punctuation/comma_if.hpp>
|
#include <boost/preprocessor/punctuation/comma_if.hpp>
|
||||||
#include <boost/preprocessor/repetition/enum_params.hpp>
|
#include <boost/preprocessor/repetition/enum_params.hpp>
|
||||||
#include <boost/preprocessor/repetition/enum_binary_params.hpp>
|
|
||||||
#include <boost/preprocessor/repetition/enum_shifted_params.hpp>
|
#include <boost/preprocessor/repetition/enum_shifted_params.hpp>
|
||||||
#include <boost/preprocessor/facilities/intercept.hpp>
|
|
||||||
#include <boost/detail/workaround.hpp>
|
#include <boost/detail/workaround.hpp>
|
||||||
#include <boost/mpl/has_xxx.hpp>
|
#include <boost/mpl/has_xxx.hpp>
|
||||||
#include <boost/mpl/if.hpp>
|
#include <boost/mpl/if.hpp>
|
||||||
@@ -24,7 +22,6 @@
|
|||||||
#include <boost/type_traits/is_pointer.hpp>
|
#include <boost/type_traits/is_pointer.hpp>
|
||||||
#include <boost/type_traits/is_member_function_pointer.hpp>
|
#include <boost/type_traits/is_member_function_pointer.hpp>
|
||||||
#include <boost/type_traits/remove_cv.hpp>
|
#include <boost/type_traits/remove_cv.hpp>
|
||||||
#include <boost/utility/declval.hpp>
|
|
||||||
|
|
||||||
#ifndef BOOST_RESULT_OF_NUM_ARGS
|
#ifndef BOOST_RESULT_OF_NUM_ARGS
|
||||||
# define BOOST_RESULT_OF_NUM_ARGS 10
|
# define BOOST_RESULT_OF_NUM_ARGS 10
|
||||||
|
@@ -98,11 +98,6 @@ struct no_result_type_or_result_of
|
|||||||
unsigned int operator()();
|
unsigned int operator()();
|
||||||
unsigned short operator()() volatile;
|
unsigned short operator()() volatile;
|
||||||
const unsigned short operator()() const volatile;
|
const unsigned short operator()() const volatile;
|
||||||
#if !defined(BOOST_NO_RVALUE_REFERENCES)
|
|
||||||
short operator()(int&&);
|
|
||||||
int operator()(int&);
|
|
||||||
long operator()(int const&);
|
|
||||||
#endif
|
|
||||||
};
|
};
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
@@ -113,11 +108,6 @@ struct no_result_type_or_result_of_template
|
|||||||
unsigned int operator()();
|
unsigned int operator()();
|
||||||
unsigned short operator()() volatile;
|
unsigned short operator()() volatile;
|
||||||
const unsigned short operator()() const volatile;
|
const unsigned short operator()() const volatile;
|
||||||
#if !defined(BOOST_NO_RVALUE_REFERENCES)
|
|
||||||
short operator()(int&&);
|
|
||||||
int operator()(int&);
|
|
||||||
long operator()(int const&);
|
|
||||||
#endif
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct X {};
|
struct X {};
|
||||||
@@ -242,14 +232,6 @@ int main()
|
|||||||
BOOST_STATIC_ASSERT((is_same<result_of<const no_result_type_or_result_of_template<void>(double)>::type, short>::value));
|
BOOST_STATIC_ASSERT((is_same<result_of<const no_result_type_or_result_of_template<void>(double)>::type, short>::value));
|
||||||
BOOST_STATIC_ASSERT((is_same<result_of<volatile no_result_type_or_result_of_template<void>(void)>::type, unsigned short>::value));
|
BOOST_STATIC_ASSERT((is_same<result_of<volatile no_result_type_or_result_of_template<void>(void)>::type, unsigned short>::value));
|
||||||
BOOST_STATIC_ASSERT((is_same<result_of<const volatile no_result_type_or_result_of_template<void>(void)>::type, const unsigned short>::value));
|
BOOST_STATIC_ASSERT((is_same<result_of<const volatile no_result_type_or_result_of_template<void>(void)>::type, const unsigned short>::value));
|
||||||
#if !defined(BOOST_NO_RVALUE_REFERENCES)
|
|
||||||
BOOST_STATIC_ASSERT((is_same<result_of<no_result_type_or_result_of(int&&)>::type, short>::value));
|
|
||||||
BOOST_STATIC_ASSERT((is_same<result_of<no_result_type_or_result_of(int&)>::type, int>::value));
|
|
||||||
BOOST_STATIC_ASSERT((is_same<result_of<no_result_type_or_result_of(int const&)>::type, long>::value));
|
|
||||||
BOOST_STATIC_ASSERT((is_same<result_of<no_result_type_or_result_of_template<void>(int&&)>::type, short>::value));
|
|
||||||
BOOST_STATIC_ASSERT((is_same<result_of<no_result_type_or_result_of_template<void>(int&)>::type, int>::value));
|
|
||||||
BOOST_STATIC_ASSERT((is_same<result_of<no_result_type_or_result_of_template<void>(int const&)>::type, long>::value));
|
|
||||||
#endif
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
14
utility.htm
14
utility.htm
@@ -224,20 +224,6 @@ typedef boost::result_of<
|
|||||||
>::type type;</pre>
|
>::type type;</pre>
|
||||||
</blockquote>
|
</blockquote>
|
||||||
|
|
||||||
<p>In a future
|
|
||||||
release, <code>BOOST_RESULT_OF_USE_DECLTYPE</code>
|
|
||||||
may be enabled by default on compilers that
|
|
||||||
support <code>decltype</code>, so if you use the above
|
|
||||||
protocol please take care to ensure that
|
|
||||||
the <code>result_type</code>
|
|
||||||
and <code>result<></code> members accurately
|
|
||||||
represent the result type. If you wish to continue to
|
|
||||||
use the protocol on compilers that
|
|
||||||
support <code>decltype</code>,
|
|
||||||
use <code>boost::tr1_result_of</code>, which is also
|
|
||||||
defined
|
|
||||||
in <code><<a href="../../boost/utility/result_of.hpp">boost/utility/result_of.hpp</a>></code>.</p>
|
|
||||||
|
|
||||||
<a name="BOOST_NO_RESULT_OF"></a>
|
<a name="BOOST_NO_RESULT_OF"></a>
|
||||||
<p>This implementation of <code>result_of</code>
|
<p>This implementation of <code>result_of</code>
|
||||||
requires class template partial specialization, the
|
requires class template partial specialization, the
|
||||||
|
Reference in New Issue
Block a user