你能保存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. ) ;
} ;
并且您想要保存函数体,以便稍后加载它(而不是总是需要硬编码)。
你能做到吗?
答案 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 ] = ...
然后在保存时,我只保存一个整数,在加载时,将整数指向源代码文件中的正确函数。