aaronman post. , , , :
template <typename T>
T deduce(void(*)(T*));
#define CALLFN(f) callfn<decltype(deduce(f)), f>
:
CALLFN(call) fun; // instead of 'callfn<call> fun;' as asked
OP , .
, std::unique_ptr T f ( void (*)(T*)), , std::unique_ptr. , :
class MObj { };
void mfree(MObj*) { }
OP,
std::unique_ptr<MObj, void(*)(MObj*)> p1(nullptr, mfree);
assert(sizeof(p1) == sizeof(MObj*) * 2);
callfn, :
std::unique_ptr<MObj, callfn<MObj, mfree>> p2;
assert(sizeof(p2) == sizeof(MObj*));
, - callfn MObj . , :
template <typename T, void (*f)(T*)>
using light_unique_ptr = std::unique_ptr<T, callfn<T, f>>;
light_unique_ptr<MObj, mfree> p3;
assert(sizeof(p3) == sizeof(MObj*));
( , ), - ,
lighter_unique_ptr<mfree> p4;
assert(sizeof(p4) == sizeof(MObj*));
mfree. , , , :
- ,
mfree ( void mfree(MObj*) void mfree(Foo*)). std::unique_ptr ( ) . 1 (MObj), 2 . , .
, ( , I-use-auto).