Skip to content

Commit da63252

Browse files
Added a typeName for std::function
Do not call eval on a function whose argument is not copy constructible, even though the argument is a reference. See ticket #65.
1 parent d58616b commit da63252

File tree

3 files changed

+22
-6
lines changed

3 files changed

+22
-6
lines changed

classdesc.h

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,8 @@ namespace std
6969
#include <unordered_set>
7070

7171
#include <type_traits>
72+
#include <functional>
73+
7274
namespace classdesc
7375
{
7476
using std::true_type;
@@ -454,7 +456,14 @@ namespace classdesc
454456
template <class F>
455457
typename enable_if<is_function<F>,string>::T
456458
inline typeName() {return "<function>";}
457-
459+
460+
#if defined(__cplusplus) && __cplusplus>=201103L
461+
template <class F> struct tn<std::function<F>>
462+
{
463+
static string name() {return "std::function<"+typeName<F>()+">";}
464+
};
465+
#endif
466+
458467
template <class T> struct tn<T*>
459468
{
460469
static std::string name()

function.h

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -496,12 +496,16 @@ namespace classdesc
496496
template <> struct Result<void>: public ResultBase
497497
{};
498498

499+
template <class T>
500+
struct is_default_and_copy_constructible:
501+
And<is_default_constructible<T>,is_copy_constructible<T>> {};
502+
499503
template <class Buffer, class F, class R=typename Return<F>::T,
500504
int N=Arity<F>::value> class CallOnBuffer;
501505

502506
/// extract an argument from buffer \a b, and run functional f on it
503507
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
505509
eval(F f, B& b)
506510
{
507511
A a{};
@@ -510,14 +514,14 @@ namespace classdesc
510514
}
511515

512516
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
514518
eval(F f, B& b)
515519
{
516520
throw std::runtime_error("unable to unpack into "+typeName<A>());
517521
}
518522

519523
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
521525
evalVoid(F f, B& b)
522526
{
523527
A a{};
@@ -526,7 +530,7 @@ namespace classdesc
526530
}
527531

528532
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
530534
evalVoid(F f, B& b)
531535
{eval<F,A,void,B>(f,b);}
532536

@@ -541,7 +545,7 @@ namespace classdesc
541545
public:
542546
CallOnBuffer(Buffer& buffer, F f): buffer(buffer), f(f) {}
543547
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>
545549
(buffer, CurryFirst<F>(f,a))();};
546550
return std::move(eval<decltype(ff),A1,Result<R>,Buffer>(ff, buffer));
547551
}

pack_base.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -301,6 +301,8 @@ namespace classdesc
301301

302302
typedef pack_t unpack_t;
303303

304+
template <> inline string typeName<pack_t>() {return "classdesc::pack_t";}
305+
304306
#ifdef XDR_PACK
305307
const int BUFCHUNK=1024;
306308

@@ -337,6 +339,7 @@ namespace classdesc
337339
std::swap(input,xdr_other->output);
338340
}
339341
};
342+
template <> inline string typeName<xdr_pack>() {return "classdesc::xdr_pack";}
340343
#else
341344
typedef pack_t xdr_pack;
342345
#endif

0 commit comments

Comments
 (0)