template <typename ParamsList , typename Tag>
struct CFuncPointorBuilder {
template <typename Callable>
static auto invoke(Callable&& call) {
return extract(std::
function(std::forward(call))); template <typename Ret, typename... Params>
static auto extract(const std::function& call) {
using CallPointor = Ret(*)(Params...);
Wrapper<Ret(Params...), Tag>::callstore = call;
return static_cast(Wrapper<Ret(Params...), Tag>::convert);
template <typename T, typename WTag>
template <typename Ret, typename... Params, typename WTag>
struct Wrapper<Ret(Params...), WTag> {
template <typename... Args>
static Ret convert(Args... args) { return callstore(args...); }
static std::function callstore;
template <typename RetParams, typename Tag>
template <typename Ret, typename... Params, typename WTag>
std::function CFuncPointorBuilder
::Wrapper<Ret(Params...), WTag>::callstore;
template <typename Ret, typename... Params, typename F, typename... Args>
static void build( Ret(**p)(Params...), F&& f, Args&&... args) {
*p = CFuncPointorBuilder<Ret(Params...), Tag>
::invoke(std::bind(std::forward(f),
template <unsigned int N>
using ZKTransferTag = std::integral_constant<unsigned int, N>;
利用 gcc __COUNTER__ 宏生成一个唯一的 Tag
把 ZKTransfer::on_conn_event 类内函数转化成 c 函数指针 赋值给 deliver_conn
void(*deliver_conn)(Ptr<zhandle_t>, int, int, const Ptr<char>, Ptr<void>);
&ZKTransfer::on_conn_event,
