|
Boost-Commit : |
Subject: [Boost-commit] svn:boost r80962 - in sandbox/type_erasure: boost/type_erasure libs/type_erasure/doc libs/type_erasure/test
From: steven_at_[hidden]
Date: 2012-10-11 17:33:50
Author: steven_watanabe
Date: 2012-10-11 17:33:49 EDT (Thu, 11 Oct 2012)
New Revision: 80962
URL: http://svn.boost.org/trac/boost/changeset/80962
Log:
Enable implicit conversion to any.
Text files modified:
sandbox/type_erasure/boost/type_erasure/any.hpp | 8 ++++----
sandbox/type_erasure/boost/type_erasure/callable.hpp | 11 ++++++-----
sandbox/type_erasure/boost/type_erasure/constructible.hpp | 12 ++++++------
sandbox/type_erasure/libs/type_erasure/doc/type_erasure.qbk | 21 ---------------------
sandbox/type_erasure/libs/type_erasure/test/test_construct.cpp | 5 +++++
sandbox/type_erasure/libs/type_erasure/test/test_construct_cref.cpp | 6 ++++++
sandbox/type_erasure/libs/type_erasure/test/test_construct_ref.cpp | 6 ++++++
7 files changed, 33 insertions(+), 36 deletions(-)
Modified: sandbox/type_erasure/boost/type_erasure/any.hpp
==============================================================================
--- sandbox/type_erasure/boost/type_erasure/any.hpp (original)
+++ sandbox/type_erasure/boost/type_erasure/any.hpp 2012-10-11 17:33:49 EDT (Thu, 11 Oct 2012)
@@ -172,7 +172,7 @@
* constructor of @c U throws.
*/
template<class U>
- explicit any(const U& data_arg)
+ any(const U& data_arg)
: table((
BOOST_TYPE_ERASURE_INSTANTIATE1(Concept, T, U),
::boost::type_erasure::make_binding<
@@ -846,7 +846,7 @@
* \throws Nothing.
*/
template<class U>
- explicit any(U& arg
+ any(U& arg
#ifndef BOOST_TYPE_ERASURE_DOXYGEN
, typename ::boost::disable_if<
::boost::mpl::or_<
@@ -1250,7 +1250,7 @@
* \throws Nothing.
*/
template<class U>
- explicit any(const U& arg)
+ any(const U& arg)
: table((
BOOST_TYPE_ERASURE_INSTANTIATE1(Concept, T, U),
::boost::type_erasure::make_binding<
@@ -1464,7 +1464,7 @@
* \throws Nothing.
*/
template<class U>
- explicit any(U&& arg
+ any(U&& arg
#ifndef BOOST_TYPE_ERASURE_DOXYGEN
, typename ::boost::disable_if<
::boost::mpl::or_<
Modified: sandbox/type_erasure/boost/type_erasure/callable.hpp
==============================================================================
--- sandbox/type_erasure/boost/type_erasure/callable.hpp (original)
+++ sandbox/type_erasure/boost/type_erasure/callable.hpp 2012-10-11 17:33:49 EDT (Thu, 11 Oct 2012)
@@ -28,6 +28,7 @@
#include <boost/type_erasure/call.hpp>
#include <boost/type_erasure/concept_interface.hpp>
#include <boost/type_erasure/rebind_any.hpp>
+#include <boost/type_erasure/param.hpp>
namespace boost {
namespace type_erasure {
@@ -90,7 +91,7 @@
_boost_type_erasure_deduce_callable(
typename ::boost::type_erasure::rebind_any<Base, T>::type...);
typename ::boost::type_erasure::rebind_any<Base, R>::type
- operator()(typename ::boost::type_erasure::rebind_any<Base, T>::type... arg)
+ operator()(typename ::boost::type_erasure::as_param<Base, T>::type... arg)
{
return ::boost::type_erasure::call(callable<R(T...), F>(), *this, arg...);
}
@@ -111,7 +112,7 @@
_boost_type_erasure_deduce_callable(
typename ::boost::type_erasure::rebind_any<Base, T>::type...) const;
typename ::boost::type_erasure::rebind_any<Base, R>::type operator()(
- typename ::boost::type_erasure::rebind_any<Base, T>::type... arg) const
+ typename ::boost::type_erasure::as_param<Base, T>::type... arg) const
{
return ::boost::type_erasure::call(callable<R(T...), const F>(), *this, arg...);
}
@@ -138,7 +139,7 @@
typename ::boost::type_erasure::rebind_any<Base, T>::type...);
using Base::operator();
typename ::boost::type_erasure::rebind_any<Base, R>::type
- operator()(typename ::boost::type_erasure::rebind_any<Base, T>::type... arg)
+ operator()(typename ::boost::type_erasure::as_param<Base, T>::type... arg)
{
return ::boost::type_erasure::call(callable<R(T...), F>(), *this, arg...);
}
@@ -165,7 +166,7 @@
typename ::boost::type_erasure::rebind_any<Base, T>::type...) const;
using Base::operator();
typename ::boost::type_erasure::rebind_any<Base, R>::type
- operator()(typename ::boost::type_erasure::rebind_any<Base, T>::type... arg) const
+ operator()(typename ::boost::type_erasure::as_param<Base, T>::type... arg) const
{
return ::boost::type_erasure::call(callable<R(T...), const F>(), *this, arg...);
}
@@ -206,7 +207,7 @@
#define BOOST_TYPE_ERASURE_DECLVAL(z, n, data) ::boost::declval<BOOST_PP_CAT(T, n)>()
#define BOOST_TYPE_ERASURE_REBIND(z, n, data)\
- typename ::boost::type_erasure::rebind_any<Base, BOOST_PP_CAT(T, n)>::type BOOST_PP_CAT(arg, n)
+ typename ::boost::type_erasure::as_param<Base, BOOST_PP_CAT(T, n)>::type BOOST_PP_CAT(arg, n)
template<class R BOOST_PP_ENUM_TRAILING_PARAMS(N, class T), class F>
struct callable<R(BOOST_PP_ENUM_PARAMS(N, T)), F>
Modified: sandbox/type_erasure/boost/type_erasure/constructible.hpp
==============================================================================
--- sandbox/type_erasure/boost/type_erasure/constructible.hpp (original)
+++ sandbox/type_erasure/boost/type_erasure/constructible.hpp 2012-10-11 17:33:49 EDT (Thu, 11 Oct 2012)
@@ -21,7 +21,7 @@
#include <boost/type_erasure/call.hpp>
#include <boost/type_erasure/concept_interface.hpp>
#include <boost/type_erasure/config.hpp>
-#include <boost/type_erasure/rebind_any.hpp>
+#include <boost/type_erasure/param.hpp>
namespace boost {
namespace type_erasure {
@@ -80,7 +80,7 @@
using Base::_boost_type_erasure_deduce_constructor;
::boost::type_erasure::constructible<R(T...)>*
_boost_type_erasure_deduce_constructor(
- typename ::boost::type_erasure::rebind_any<Base, T>::type...)
+ typename ::boost::type_erasure::as_param<Base, T>::type...)
{
return 0;
}
@@ -126,7 +126,7 @@
#define N BOOST_PP_ITERATION()
#define BOOST_TYPE_ERASURE_ARG_DECL(z, n, data) \
- typename ::boost::type_erasure::rebind_any< \
+ typename ::boost::type_erasure::as_param< \
Base, \
BOOST_PP_CAT(T, n) \
>::type
@@ -143,15 +143,15 @@
}
};
-template<class Base, class R BOOST_PP_ENUM_TRAILING_PARAMS(N, class T), class Tag>
+template<class Base BOOST_PP_ENUM_TRAILING_PARAMS(N, class T), class Tag>
struct concept_interface<
- ::boost::type_erasure::constructible<R(BOOST_PP_ENUM_PARAMS(N, T))>,
+ ::boost::type_erasure::constructible<Tag(BOOST_PP_ENUM_PARAMS(N, T))>,
Base,
Tag
> : Base
{
using Base::_boost_type_erasure_deduce_constructor;
- ::boost::type_erasure::constructible<R(BOOST_PP_ENUM_PARAMS(N, T))>*
+ ::boost::type_erasure::constructible<Tag(BOOST_PP_ENUM_PARAMS(N, T))>*
_boost_type_erasure_deduce_constructor(
BOOST_PP_ENUM(N, BOOST_TYPE_ERASURE_ARG_DECL, ~))
{
Modified: sandbox/type_erasure/libs/type_erasure/doc/type_erasure.qbk
==============================================================================
--- sandbox/type_erasure/libs/type_erasure/doc/type_erasure.qbk (original)
+++ sandbox/type_erasure/libs/type_erasure/doc/type_erasure.qbk 2012-10-11 17:33:49 EDT (Thu, 11 Oct 2012)
@@ -564,27 +564,6 @@
substitute for template parameters, I'd really like
to use `_T`. Alack-a-day, `_T` is a reserved identifier.
`_self` was the best I could think of.
-* Implicit conversions. Implicit conversion from the
- contained type to a reference any is not allowed.
- The reason for this is that I found that such
- conversions were interefering with overload resolution.
- Getting overload resolution to work correctly in
- the following would be a lot more difficult if
- implicit conversion were allowed:
- ``
- typedef mpl::vector<
- copy_constructible<>,
- constructible<_self(const std::string&)>
- > concept;
- any<concept> x = ...;
- any<concept> y(binding_of(x), "hello");
- ``
- Without great care we end up with an ambiguity
- between the `std::string` constructor and the
- copy constructor. User-defined overloaded
- functions would also need to handle this somehow.
- I decided that it was better to avoid the whole
- problem by disabling implicit conversions.
* __relaxed_match. I considered a lot of names
for this, `strict_match<false>`, `enable_mixed`,
`nonstrict_match`, `loose_match`, `best_effort`,
Modified: sandbox/type_erasure/libs/type_erasure/test/test_construct.cpp
==============================================================================
--- sandbox/type_erasure/libs/type_erasure/test/test_construct.cpp (original)
+++ sandbox/type_erasure/libs/type_erasure/test/test_construct.cpp 2012-10-11 17:33:49 EDT (Thu, 11 Oct 2012)
@@ -29,6 +29,11 @@
typeid_<T>
> {};
+BOOST_AUTO_TEST_CASE(test_implicit) {
+ any<common<> > x = 1;
+ BOOST_CHECK_EQUAL(any_cast<int>(x), 1);
+}
+
BOOST_AUTO_TEST_CASE(test_unary)
{
typedef ::boost::mpl::vector<
Modified: sandbox/type_erasure/libs/type_erasure/test/test_construct_cref.cpp
==============================================================================
--- sandbox/type_erasure/libs/type_erasure/test/test_construct_cref.cpp (original)
+++ sandbox/type_erasure/libs/type_erasure/test/test_construct_cref.cpp 2012-10-11 17:33:49 EDT (Thu, 11 Oct 2012)
@@ -31,6 +31,12 @@
template<class T>
const T& as_const(const T& arg) { return arg; }
+BOOST_AUTO_TEST_CASE(test_implicit) {
+ int i = 4;
+ any<common<>, const _self&> x = i;
+ BOOST_CHECK_EQUAL(any_cast<const int*>(&x), &i);
+}
+
BOOST_AUTO_TEST_CASE(test_from_int_with_binding)
{
typedef ::boost::mpl::vector<common<> > test_concept;
Modified: sandbox/type_erasure/libs/type_erasure/test/test_construct_ref.cpp
==============================================================================
--- sandbox/type_erasure/libs/type_erasure/test/test_construct_ref.cpp (original)
+++ sandbox/type_erasure/libs/type_erasure/test/test_construct_ref.cpp 2012-10-11 17:33:49 EDT (Thu, 11 Oct 2012)
@@ -31,6 +31,12 @@
template<class T>
const T& as_const(const T& arg) { return arg; }
+BOOST_AUTO_TEST_CASE(test_implicit) {
+ int i = 4;
+ any<common<>, _self&> x = i;
+ BOOST_CHECK_EQUAL(any_cast<int*>(&x), &i);
+}
+
BOOST_AUTO_TEST_CASE(test_from_int_with_binding)
{
typedef ::boost::mpl::vector<common<> > test_concept;
Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk