gpt4 book ai didi

c++ - 将 C++ lambdas 存储为二进制数据

转载 作者:太空狗 更新时间:2023-10-29 20:10:41 26 4
gpt4 key购买 nike

我目前正在尝试扩展 sqrat(squirrel 绑定(bind)实用程序)以满足将 lambda 表达式绑定(bind)到 squirrel 的需求。

我遇到的问题是,虽然存储和调用代码可以知道 lambda 的签名(这里是设置将执行 lambda 的函数的代码)

// Arg Count 0
template <class R, class Args, class Arity>
SQFUNCTION SqMemberLambdaFuncDetail(R result,
Args args,
boost::mpl::integral_c<unsigned int, 1> arity)
{
return &SqLambda<R>::template Func0<false>;
}

// Arg Count 1
template <class R, class Args, class Arity>
SQFUNCTION SqMemberLambdaFuncDetail(R result,
Args args,
boost::mpl::integral_c<unsigned int, 2> arity)
{
return &SqLambda<R>::template Func1<boost::mpl::at_c<Args, 1>::type, 2, false>;
}

template <class F>
SQFUNCTION SqMemberLambdaFunc(F f)
{
typedef boost::function_types::result_type<decltype(&F::operator())>::type result_t;
typedef boost::function_types::function_arity< decltype(&F::operator())> arity_t;
typedef boost::function_types::parameter_types< decltype(&F::operator())>::type args_t;
result_t result;
args_t args;
arity_t arity;
return SqMemberLambdaFuncDetail<result_t, args_t, arity_t>(result, args, arity);
}

lambda 本身需要以匿名形式存储,作为二进制数据,我似乎找不到办法做到这一点。

最佳答案

Lambda 不保证是标准布局(因此查看它们的位永远是不合法的),它们的内容也不是可自省(introspection)的。

如果您想要可以序列化然后远程运行的代码,请使用脚本引擎。有很多,其中一些与 C++ 交互良好。

或者只是提升 phoenix,它使可反射的 C++ 代码成为 lambda 代码。

但是,如果您唯一的问题是存储带有签名 R(Args...) 的 lambda 的拷贝一般来说,只需使用 std::function<R(Args...)> .

关于c++ - 将 C++ lambdas 存储为二进制数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37896707/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com