2011-10-14 25 views
2

您可以保存C++ lambda/functor的函數體嗎?序列化C++函子

例如,假設你有

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.) ; 
} ; 

而且你要保存的函數體,以便以後可以加載(而不是總是不必硬編碼)。

你能做到嗎?

回答

5

這個lambda沒有狀態(不是閉包),所以它是一個普通的函數。

因此保存它與保存任何功能相同的問題。一般情況下是不可能的,但只要您將它重新加載到完全相同的過程中,實際上可能只需要reinterpret_cast-指向char*的函數指針並讀取足夠的字節數。然而,這將是非常不可移植的,並且在一些體系結構或某些編譯器中可能根本不起作用。

再次:沒有標準兼容的方式將代碼視爲數據。另一方面,有符號表達式庫允許使用普通代碼語法捕獲表達式樹,但是根本沒有處理函子(沒有代碼,只有數據)。

+0

嗯。我的代碼將有多少個字節?或者我們可以不知道? – bobobobo

1

爲了增加本的答案,我現在這樣做:

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 ] = ... 

然後保存的時候,我只保存一個整數,並在負荷,在源代碼文件指向正確的函數整數。

+0

是的,這是一個更好的方法。比試圖保存該功能本身。 –

+0

嗨@bobobobo,這種方法工作嗎?你用什麼來序列化vector的'funcs'?提升序列化?別的東西? – weima

+0

@weima是的,它工作正常。這些函數從未被序列化,它們仍然在源代碼中(畢竟它們是_code_)。一個'int'被保存到保存文件中。在加載時,你將'int'與適當的函數連接起來。請參閱[數學形式在這裏的數學形狀.html(MagFunctions)](https://github.com/superwills/gtp/blob/master/gtp/geometry/MathematicalShape.h) – bobobobo