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

时间:2017-07-14 13:38:08

标签: c++ capnproto

我刚开始尝试使用cap&n; proto并尝试提高我的理解力。

现在我正试图弄清楚如何最好地使用AnyPointer,在进行实验时我注意到我似乎不需要为我的对象调用initAs,我设置的值将被正确读取

这是我的根容器的架构,它具有任何类型的struct对象

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会破坏它?

1 个答案:

答案 0 :(得分:0)

来自Capo&Proto的Proto网站 https://capnproto.org/cxx.html#structs

  

getBar():对于基元,返回值。对于复合材料,返回a   复合生成器。如果没有复合字段   初始化(即这是第一次被访问),它   将被初始化为该字段的默认值的副本   返回。

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

你必须在列出名单时调用init {field}。