C++ 为什么我不需要在capnproto中使用AnyPointer::initAs呢?

C++ 为什么我不需要在capnproto中使用AnyPointer::initAs呢?,c++,capnproto,C++,Capnproto,我刚开始尝试cap'n proto并试图提高我的理解力 现在我正试图找出如何最好地使用AnyPointer,在进行实验时,我注意到我似乎不需要为我的对象调用initAs,我设置的值将被正确读取 这是我对具有任何类型结构对象的根容器的模式 struct TestObject { value1 @0 : Int32 = -5; value2 @1 : Float32 = 9.4; } struct TestContainer { object @0: AnyPointer; } 当我

我刚开始尝试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 );
::capnp::MallocMessageBuilder消息;
自动容器=message.initRoot();
auto anything=container.initObject();
auto objectBuilder=anything.getAs()//我原以为这会中断,因为没有任何明显的初始化。
objectBuilder.setValue1(-2099);
objectBuilder.setValue2(-3.994f);
//使用initAs也可以
auto anything=container.initObject();
auto objectBuilder=anything.initAs();
objectBuilder.setValue1(270001);
objectBuilder.setValue2(-65.2f);

当我再次反序列化时,我从上述任何一种方法中得到正确的值。在这里使用getAs是正确的还是更复杂的测试对象会破坏一切?

来自Cap'n Proto的网站

getBar():对于基本体,返回值。对于复合,返回一个 复合材料的生成器。如果尚未创建复合字段 初始化(即,这是第一次访问它),它 将初始化为之前字段默认值的副本 返回

所以是的-您不必调用init{field}(),但可以为任何结构类型调用get{field}(),而不仅仅是任何指针

当它是一个列表时,您必须调用init{field}