2011-10-14 3 views
2

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

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

Вы можете сделать это?

ответ

5

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

Сохранение этого является той же проблемой, что и сохранение любой функции. Это невозможно вообще, но до тех пор, пока вы загружаете его обратно в тот же самый процесс, это может быть практически на практике, только на 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, сделал этот подход работы? что вы использовали для сериализации векторных «funcs»? повысить сериализацию? что-то другое? – weima

+0

@weima Да, он отлично работает. Функции никогда не сериализуются, они остаются в источнике (в конце концов, они _code_). Один «int» сохраняется в файле сохранения. Во время загрузки вы связываете 'int' с соответствующей функцией. См. [MagFunctions in MathematicalShape.h здесь] (https://github.com/superwills/gtp/blob/master/gtp/geometry/MathematShape.h) – bobobobo