首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我不需要在capnproto中使用AnyPointer::initAs?

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

Stack Overflow用户
提问于 2017-07-14 21:38:08
回答 1查看 149关注 0票数 0

我刚刚开始尝试cap,并试图提高我的理解能力。

现在,我正在试图找出如何最好地使用AnyPointer,在实验中,我注意到我似乎不需要为我的对象调用initAs,并且我设置的值将被正确读取。

这是我对具有任何类型的struct对象的根容器的模式

代码语言:javascript
复制
struct TestObject
{
  value1 @0 : Int32 = -5;
  value2 @1 : Float32 = 9.4;
}

struct TestContainer
{
  object @0: AnyPointer;
}

当我序列化一些对象时,我使用initAs还是getAs似乎并不重要。

代码语言:javascript
复制
    ::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会破坏一切吗?

EN

回答 1

Stack Overflow用户

发布于 2017-07-14 23:55:18

来自普罗托角的网站https://capnproto.org/cxx.html#structs

getBar():对于基本类型,返回值。对于复合对象,返回复合对象的生成器。如果复合字段尚未初始化(即这是它第一次被访问),则在返回之前,它将被初始化为该字段的默认值的副本。

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45104440

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档