Сериализация функтора C ++ - PullRequest
2 голосов
/ 14 октября 2011

Можете ли вы сохранить тело функции лямбда / функтора 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. ) ;
} ;

И вы хотите сохранить тело функции, чтобы вы могли загрузитьэто позже (вместо того, чтобы постоянно его кодировать).

Можете ли вы сделать это?

Ответы [ 2 ]

5 голосов
/ 14 октября 2011

Эта лямбда не имеет состояния (не замыкания), поэтому это обычная функция.

Следовательно, ее сохранение - такая же проблема, как и сохранение любой функции.В общем, это невозможно, но пока вы загружаете его обратно в тот же процесс, это может быть возможно на практике, просто reinterpret_cast - указав указатель функции на char* и прочитав достаточное количествобайт.Однако это будет крайне непереносимо и может вообще не работать на некоторых архитектурах или с некоторыми компиляторами.

Опять же: Не существует стандартного способа обработки кода как данных .

С другой стороны, есть библиотеки символьных выражений, которые позволяют захватывать дерево выражений с использованием обычного синтаксиса кода, но тогда вы вообще не имеете дело с функтором (кода нет, только данные).

1 голос
/ 14 октября 2011

Чтобы добавить ответ Бена, я сейчас делаю это:

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

Затем при сохранении я сохраняю только целое число, а при загрузке указываю целое число на правильную функцию в исходном коде.файл.

...