序列化C++仿函数

bob*_*obo 2 c++ lambda serialization functor

你能保存C++ lambda/functor的函数体吗?

例如,假设你有

light0->lightFunction = []( real tEl, real pAz ) -> Vector {

  return Vector(
    // red is up lobe
    std::max<real>( 0., 5*cos(tEl)-4 ),

    // green lower lobe
    std::max<real>( 0., -4*sin(tEl-PI)*cos(pAz-2.5)-3),

    0. ) ;
} ;
Run Code Online (Sandbox Code Playgroud)

并且您希望保存函数体,以便稍后加载它(而不是总是需要对其进行硬编码).

你可以做到吗?

Ben*_*igt 5

这个lambda没有状态(不是闭包),所以它是一个普通的函数.

因此保存它与保存任何功能是同一个问题.一般情况下这是不可能的,但只要你将它加载回完全相同的过程,实际上可能只需reinterpret_cast将函数指针指向a char*并读取足够数量的字节即可.但这将是非常不可移植的,并且可能在某些体系结构或某些编译器上根本不起作用.

再说一遍:没有符合标准的方法将代码视为数据.

另一方面,有一些符号表达式库允许使用普通的代码语法捕获表达式树,但是你根本没有处理一个仿函数(没有代码,只有数据).