protobuf string类型_protobuf 的enum与string转换

c/c++ enum 介绍

说起c/c++ 的enum,比起python 真的是方便简洁

enum type{

type1 = 0,

type2

}

enum的元素对应的int 默认从0 开始依次增加, 除非手动指定起始值。

int val = type1;

assert(val == 0)

enum 内的元素是全局的,意味着在其它地方直接使用 type type_1 = type1;

C++ 11 引入 enum class, 这样里面的元素不再是全局了

enum class int32_t type{

type1 = 0,

type2

}

这样在使用的时候必须是 type type_1 = type::type1, 并且可以指定底层类型例如uint8 等。

并且c++11 种enum 不能隐式转换了,必须强转

type type_1 = type::type1;

int32_t type_impliticy_convert = type_1; // wrong

int32_t type_impliticy_convert = static_cast(type_1); // ok

enum方便,但是如果要转换成string很麻烦,必须一个个匹配。而且与int 互转而且还要考虑索引边界

引出正题,protocbuf 提供的enum 就比较方便了

protobuf 具体详情就不解释,有兴趣自己看官方文档。

从protobuf 生成的pb.cc 文件可以看出,除了提供一个索引验证函数IsValid(int value) 可以检查边界。

另外还提供了一个descriptor() ;

// Force running AddDescriptors() at dynamic initialization time.

static bool dynamic_init_dummy_XXX_2eproto = ( ::PROTOBUF_NAMESPACE_ID::internal::AddDescriptors(&descriptor_table_XXX_2eproto), true);

namespace XXX {

const ::PROTOBUF_NAMESPACE_ID::EnumDescriptor* XXX_descriptor() {

::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(&descriptor_table_XXX_2eproto);

return file_level_enum_descriptors_XXX_2eproto[0];

}

bool JobState_IsValid(int value) {

switch (value) {

case 0:

case 1:

case 2:

case 3:

case 4:

case 5:

case 6:

return true;

default:

return false;

}

}

descriptor() 返回一个google::protobuf::EnumDescriptor的指针,利用这个指针可以方便得得到enum的litteral 值和offset 例如

auto descriptor = XXX:: xxx_descriptor();

auto string_1 = descriptor->FindValueByNumber(1)->value();

auto number_1 = descriptor->FindValueByName("type1")->number();

可以得到1的字面string, 在项目如果经常需要字符串和enum 转换可以考虑直接使用protobuf的内置enum

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Proto3中,我们可以通过在.proto文件中使用option来指定某些参数,这些参数可以用于生成代码或在运行时使用。而自定义option可以让我们更加灵活地定制我们的Proto3语法。 自定义option的语法如下: ``` option <option_name> = <option_value>; ``` 其中,`<option_name>`表示自定义option的名称,`<option_value>`表示自定义option的值,可以是字符串、整数、浮点数、布尔值等类型。可以在`.proto`文件的顶部定义自定义option,也可以在message、enum、service、method等部分使用自定义option。 例如,在message中使用自定义option: ``` message Person { option (my_option) = "hello"; string name = 1; int32 age = 2; } ``` 在上面的例子中,我们定义了一个名为`my_option`的自定义option,并将它的值设为`"hello"`。当生成代码时,我们可以读取该option的值,并根据需要进行处理。在运行时,我们也可以使用该option的值来实现一些特定的功能。 需要注意的是,在使用自定义option时,我们需要先定义好option的名称和类型,否则会出现编译错误。一般来说,我们可以在`.proto`文件的顶部定义自定义option,例如: ``` syntax = "proto3"; import "google/protobuf/descriptor.proto"; extend google.protobuf.MessageOptions { string my_option = 1234; } ``` 在上面的例子中,我们在`.proto`文件的顶部定义了一个名为`my_option`的自定义option,类型为`string`,编号为`1234`。在使用时,我们可以直接引用这个定义好的option。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值