repeated google.protobuf.DoubleValue与repeated double的区别及C++操作方法
在C++中操作repeated google.protobuf.DoubleValue的方法
repeated double是原生基本类型的数组,而repeated google.protobuf.DoubleValue是包装类型对象的数组,两者操作逻辑完全不同——你之前直接传1.0给add_num()报错,就是因为add_num()需要的是DoubleValue对象,而非原生double值。
以下是具体的设置与取值方法:
设置值的几种方式
1. 直接通过返回指针设置值
add_num()会返回一个指向新创建的DoubleValue对象的指针,直接调用它的set_value()方法即可:
MathData var; var.add_num()->set_value(1.0);
2. 构造对象后添加
如果需要先处理DoubleValue对象再加入数组,可以先构造对象、设置值,再通过CopyFrom()添加:
MathData var; google::protobuf::DoubleValue val; val.set_value(2.5); var.add_num()->CopyFrom(val);
3. 修改已有位置的元素
要修改数组中指定位置的元素,用mutable_num(index)获取可修改的指针,再调用set_value():
MathData var; // 先添加一个元素 var.add_num()->set_value(1.0); // 修改第0个元素的值为3.14 var.mutable_num(0)->set_value(3.14);
获取值的方法
获取指定位置的值
通过num(index)获取DoubleValue的const引用,再调用value()方法取出原生double值:
MathData var; var.add_num()->set_value(5.0); double target_val = var.num(0).value();
遍历所有元素的值
可以用普通for循环或者C++11及以上支持的范围for循环:
MathData var; var.add_num()->set_value(1.0); var.add_num()->set_value(2.0); var.add_num()->set_value(3.0); // 普通for循环 for (int i = 0; i < var.num_size(); ++i) { double val = var.num(i).value(); // 处理每个val } // 范围for循环 for (const auto& dv : var.num()) { double val = dv.value(); // 处理每个val }
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

