序列化C ++仿函数

时间:2011-10-14 18:19:01

标签: c++ serialization lambda 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. ) ;
} ;

并且您想要保存函数体,以便稍后加载它(而不是总是需要硬编码)。

你能做到吗?

2 个答案:

答案 0 :(得分:5)

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

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

再次:没有符合标准的方法将代码视为数据

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

答案 1 :(得分:1)

为了补充Ben的答案,我现在正在这样做:

vector< function <Vector ( real tEl, real pAz )> > funcs ;
funcs.resize( 5 ) ;
// write functions here
funcs[ 0 ] = []( 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. ) ;

funcs[ 1 ] = ...

然后在保存时,我只保存一个整数,在加载时,将整数指向源代码文件中的正确函数。