@@ -496,12 +496,16 @@ namespace classdesc
496
496
template <> struct Result <void >: public ResultBase
497
497
{};
498
498
499
+ template <class T >
500
+ struct is_default_and_copy_constructible :
501
+ And<is_default_constructible<T>,is_copy_constructible<T>> {};
502
+
499
503
template <class Buffer , class F , class R =typename Return<F>::T,
500
504
int N=Arity<F>::value> class CallOnBuffer ;
501
505
502
506
// / extract an argument from buffer \a b, and run functional f on it
503
507
template <class F , class A , class R , class B >
504
- typename enable_if<is_default_constructible <A>, R>::T
508
+ typename enable_if<is_default_and_copy_constructible <A>, R>::T
505
509
eval (F f, B& b)
506
510
{
507
511
A a{};
@@ -510,14 +514,14 @@ namespace classdesc
510
514
}
511
515
512
516
template <class F , class A , class R , class B >
513
- typename enable_if<Not<is_default_constructible <A>>, R>::T
517
+ typename enable_if<Not<is_default_and_copy_constructible <A>>, R>::T
514
518
eval (F f, B& b)
515
519
{
516
520
throw std::runtime_error (" unable to unpack into " +typeName<A>());
517
521
}
518
522
519
523
template <class F , class A , class B >
520
- typename enable_if<is_default_constructible <A>, void >::T
524
+ typename enable_if<is_default_and_copy_constructible <A>, void >::T
521
525
evalVoid (F f, B& b)
522
526
{
523
527
A a{};
@@ -526,7 +530,7 @@ namespace classdesc
526
530
}
527
531
528
532
template <class F , class A , class B >
529
- typename enable_if<Not<is_default_constructible <A>>, void >::T
533
+ typename enable_if<Not<is_default_and_copy_constructible <A>>, void >::T
530
534
evalVoid (F f, B& b)
531
535
{eval<F,A,void ,B>(f,b);}
532
536
@@ -541,7 +545,7 @@ namespace classdesc
541
545
public:
542
546
CallOnBuffer (Buffer& buffer, F f): buffer(buffer), f(f) {}
543
547
Result<R> operator ()() {
544
- auto ff=[&](A1& a){return CallOnBuffer<Buffer, CurryFirst<F>, R, N-1 >
548
+ auto ff=[&](typename Arg<F, 1 >::T a){return CallOnBuffer<Buffer, CurryFirst<F>, R, N-1 >
545
549
(buffer, CurryFirst<F>(f,a))();};
546
550
return std::move (eval<decltype (ff),A1,Result<R>,Buffer>(ff, buffer));
547
551
}
0 commit comments