2017-07-14 62 views
0

我刚刚开始尝试cap'n proto,并试图提高我的理解。为什么我不需要在capnproto中使用AnyPointer :: initAs?

现在我正在努力研究如何最好地使用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

从头儿原网站 https://capnproto.org/cxx.html#structs

getBar():对于原语,返回值。对于复合材料,返回 生成器。如果复合字段不是 已初始化(即,这是它第一次被访问),则 将被初始化为字段默认值的副本,然后返回 。

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

虽然你必须调用init {field}。

相关问题