Почему мне не нужно использовать AnyPointer :: initAs в capnproto?

Я только начинаю экспериментировать с cap’n proto и пытаюсь улучшить мое понимание.

Прямо сейчас я пытаюсь понять, как лучше использовать AnyPointer, и во время экспериментов я заметил, что мне не нужно вызывать initAs для моего объекта, и значения, которые я установил, будут прочитаны правильно.

Это моя схема для корневого контейнера, который имеет какой-либо объект структуры

struct TestObject
{
value1 @0 : Int32 = -5;
value2 @1 : Float32 = 9.4;
}

struct TestContainer
{
object @0: AnyPointer;
}

Когда я начинаю сериализовывать некоторые объекты, мне кажется, что не имеет значения, использую ли я initAs или getAs.

    ::capnp::MallocMessageBuilder message;
auto container= message.initRoot<TestContainer>();

auto anything = container.initObject();
auto objectBuilder = anything.getAs<TestObject>();  //I was expecting this to break since nothing obviously initialises it.
objectBuilder.setValue1( -2099 );
objectBuilder.setValue2( -3.994f );

//using initAs works as well
auto anything = container.initObject();
auto objectBuilder = anything.initAs<TestObject>();
objectBuilder.setValue1( 270001 );
objectBuilder.setValue2( -65.2f );

Когда я снова десериализуюсь, я получаю правильные значения от любого из вышеупомянутых методов. Правильно ли здесь использовать getAs или более сложный TestObject сломает вещи?

0

Решение

С сайта Cap’n Proto
https://capnproto.org/cxx.html#structs

getBar (): для примитивов возвращает значение. Для композитов возвращает
Строитель для композита. Если составное поле не было
инициализирован (то есть это первый раз, когда к нему обращались), он
будет инициализирован до копии значения поля по умолчанию до
возвращение.

Так что да — вам не нужно вызывать init {field} (), но вы можете просто вызвать get {field} () для любого типа структуры, а не только AnyPointer.

Вы должны вызвать init {field}, хотя это список.

0

Другие решения

Других решений пока нет …