Index: boost_1_64_0/boost/context/continuation.hpp
===================================================================
--- boost_1_64_0.orig/boost/context/continuation.hpp	2017-04-24 12:36:55.987412031 +0100
+++ boost_1_64_0/boost/context/continuation.hpp	2017-04-24 12:37:49.730416122 +0100
@@ -56,7 +56,7 @@
 namespace context {
 namespace detail {
 
-template< int N >
+template<typename U>
 struct helper {
     template< typename T >
     static T convert( T && t) noexcept {
@@ -64,8 +64,8 @@
     }
 };
 
-template<>
-struct helper< 1 > {
+template<typename U>
+struct helper< std::tuple<U> > {
     template< typename T >
     static std::tuple< T > convert( T && t) noexcept {
         return std::make_tuple( std::forward< T >( t) );
@@ -239,15 +239,16 @@
 
 }
 
-template< typename Ctx, typename Fn, typename ... Arg >
+template< typename Ctx, typename Fn, typename Arg >
 detail::transfer_t context_ontop( detail::transfer_t t) {
-    auto p = static_cast< std::tuple< Fn, std::tuple< Arg ... > > * >( t.data);
+    auto p = static_cast< Arg * >( t.data);
     BOOST_ASSERT( nullptr != p);
     typename std::decay< Fn >::type fn = std::forward< Fn >( std::get< 0 >( * p) );
     t.data = & std::get< 1 >( * p);
     Ctx c{ t };
     // execute function, pass continuation via reference
-    std::get< 1 >( * p) = detail::helper< sizeof ... (Arg) >::convert( fn( std::move( c) ) );
+    typedef typename std::decay<decltype(std::get<1>(*p))>::type H;
+    std::get< 1 >(* p) = detail::helper<H>::convert( fn( std::move( c) ) );
 #if defined(BOOST_NO_CXX14_STD_EXCHANGE)
     return { detail::exchange( c.t_.fctx, nullptr), & std::get< 1 >( * p) };
 #else
@@ -275,7 +276,7 @@
     template< typename Ctx, typename StackAlloc, typename Fn >
     friend class detail::record;
 
-    template< typename Ctx, typename Fn, typename ... Arg >
+    template< typename Ctx, typename Fn, typename Arg >
     friend detail::transfer_t
     context_ontop( detail::transfer_t);
 
@@ -354,7 +355,7 @@
     template< typename Fn, typename ... Arg >
     continuation resume_with( Fn && fn, Arg ... arg) {
         BOOST_ASSERT( nullptr != t_.fctx);
-        auto tpl = std::make_tuple( std::forward< Fn >( fn), std::forward< Arg >( arg) ... );
+        auto tpl = std::make_tuple( std::forward< Fn >( fn), std::make_tuple( std::forward< Arg >( arg) ... ));
         return detail::ontop_fcontext(
 #if defined(BOOST_NO_CXX14_STD_EXCHANGE)
                     detail::exchange( t_.fctx, nullptr),
@@ -362,7 +363,7 @@
                     std::exchange( t_.fctx, nullptr),
 #endif
                     & tpl,
-                    context_ontop< continuation, Fn, Arg ... >);
+                    context_ontop< continuation, Fn, decltype(tpl) >);
     }
 
     continuation resume() {
@@ -451,7 +452,8 @@
 template<
     typename Fn,
     typename ... Arg,
-    typename = detail::disable_overload< continuation, Fn >
+    typename = detail::disable_overload< continuation, Fn >,
+    typename = detail::disable_overload< std::allocator_arg_t, Fn >
 >
 continuation
 callcc( Fn && fn, Arg ... arg) {
