diff --git a/include/boost/coroutine2/detail/disable_overload.hpp b/include/boost/coroutine2/detail/disable_overload.hpp new file mode 100644 index 0000000..633d468 --- /dev/null +++ b/include/boost/coroutine2/detail/disable_overload.hpp @@ -0,0 +1,34 @@ + +// Copyright Oliver Kowalke 2014. +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +#ifndef BOOST_COROUTINES2_DETAIL_DISABLE_OVERLOAD_H +#define BOOST_COROUTINES2_DETAIL_DISABLE_OVERLOAD_H + +#include + +#include +#include + +#include + +#ifdef BOOST_HAS_ABI_HEADERS +# include BOOST_ABI_PREFIX +#endif + +namespace boost { +namespace coroutines2 { +namespace detail { + +template< typename X, typename Y > +using disable_overload = boost::context::detail::disable_overload< X, Y >; + +}}} + +#ifdef BOOST_HAS_ABI_HEADERS +#include BOOST_ABI_SUFFIX +#endif + +#endif // BOOST_COROUTINES2_DETAIL_DISABLE_OVERLOAD_H diff --git a/include/boost/coroutine2/detail/pull_coroutine.hpp b/include/boost/coroutine2/detail/pull_coroutine.hpp index 7826c98..7123eac 100644 --- a/include/boost/coroutine2/detail/pull_coroutine.hpp +++ b/include/boost/coroutine2/detail/pull_coroutine.hpp @@ -14,6 +14,7 @@ #include #include +#include #ifdef BOOST_HAS_ABI_HEADERS # include BOOST_ABI_PREFIX @@ -38,7 +39,9 @@ private: bool has_result_() const noexcept; public: - template< typename Fn > + template< typename Fn, + typename = detail::disable_overload< pull_coroutine, Fn > + > explicit pull_coroutine( Fn &&); template< typename StackAllocator, typename Fn > @@ -148,7 +151,9 @@ private: bool has_result_() const noexcept; public: - template< typename Fn > + template< typename Fn, + typename = detail::disable_overload< pull_coroutine, Fn > + > explicit pull_coroutine( Fn &&); template< typename StackAllocator, typename Fn > @@ -256,7 +261,9 @@ private: explicit pull_coroutine( control_block *) noexcept; public: - template< typename Fn > + template< typename Fn, + typename = detail::disable_overload< pull_coroutine, Fn > + > explicit pull_coroutine( Fn &&); template< typename StackAllocator, typename Fn > diff --git a/include/boost/coroutine2/detail/pull_coroutine.ipp b/include/boost/coroutine2/detail/pull_coroutine.ipp index eff9dd8..a6c45fd 100644 --- a/include/boost/coroutine2/detail/pull_coroutine.ipp +++ b/include/boost/coroutine2/detail/pull_coroutine.ipp @@ -15,6 +15,7 @@ #include #include +#include #include #include @@ -40,7 +41,9 @@ pull_coroutine< T >::has_result_() const noexcept { } template< typename T > -template< typename Fn > +template< typename Fn, + typename +> pull_coroutine< T >::pull_coroutine( Fn && fn) : pull_coroutine{ default_stack(), std::forward< Fn >( fn) } { } @@ -107,7 +110,9 @@ pull_coroutine< T & >::has_result_() const noexcept { } template< typename T > -template< typename Fn > +template< typename Fn, + typename +> pull_coroutine< T & >::pull_coroutine( Fn && fn) : pull_coroutine{ default_stack(), std::forward< Fn >( fn) } { } @@ -167,7 +172,9 @@ pull_coroutine< void >::pull_coroutine( control_block * cb) noexcept : cb_{ cb } { } -template< typename Fn > +template< typename Fn, + typename +> pull_coroutine< void >::pull_coroutine( Fn && fn) : pull_coroutine{ default_stack(), std::forward< Fn >( fn) } { } diff --git a/include/boost/coroutine2/detail/push_coroutine.hpp b/include/boost/coroutine2/detail/push_coroutine.hpp index defdc74..5d9d092 100644 --- a/include/boost/coroutine2/detail/push_coroutine.hpp +++ b/include/boost/coroutine2/detail/push_coroutine.hpp @@ -14,6 +14,7 @@ #include #include +#include #ifdef BOOST_HAS_ABI_HEADERS # include BOOST_ABI_PREFIX @@ -36,7 +37,9 @@ private: explicit push_coroutine( control_block *) noexcept; public: - template< typename Fn > + template< typename Fn, + typename = detail::disable_overload< push_coroutine, Fn > + > explicit push_coroutine( Fn &&); template< typename StackAllocator, typename Fn > @@ -114,7 +117,9 @@ private: explicit push_coroutine( control_block *) noexcept; public: - template< typename Fn > + template< typename Fn, + typename = detail::disable_overload< push_coroutine, Fn > + > explicit push_coroutine( Fn &&); template< typename StackAllocator, typename Fn > @@ -190,7 +195,9 @@ private: explicit push_coroutine( control_block *) noexcept; public: - template< typename Fn > + template< typename Fn, + typename = detail::disable_overload< push_coroutine, Fn > + > explicit push_coroutine( Fn &&); template< typename StackAllocator, typename Fn > diff --git a/include/boost/coroutine2/detail/push_coroutine.ipp b/include/boost/coroutine2/detail/push_coroutine.ipp index bd4fb2e..df54d69 100644 --- a/include/boost/coroutine2/detail/push_coroutine.ipp +++ b/include/boost/coroutine2/detail/push_coroutine.ipp @@ -14,6 +14,7 @@ #include #include +#include #include #include @@ -33,7 +34,9 @@ push_coroutine< T >::push_coroutine( control_block * cb) noexcept : } template< typename T > -template< typename Fn > +template< typename Fn, + typename +> push_coroutine< T >::push_coroutine( Fn && fn) : push_coroutine{ default_stack(), std::forward< Fn >( fn) } { } @@ -91,7 +94,9 @@ push_coroutine< T & >::push_coroutine( control_block * cb) noexcept : } template< typename T > -template< typename Fn > +template< typename Fn, + typename +> push_coroutine< T & >::push_coroutine( Fn && fn) : push_coroutine{ default_stack(), std::forward< Fn >( fn) } { } @@ -141,7 +146,9 @@ push_coroutine< void >::push_coroutine( control_block * cb) noexcept : cb_{ cb } { } -template< typename Fn > +template< typename Fn, + typename +> push_coroutine< void >::push_coroutine( Fn && fn) : push_coroutine{ default_stack(), std::forward< Fn >( fn) } { }