跳到主要内容
版本:1.6.0

C++

输出布局

C++ 输出为每个 Schema 文件生成一个头文件,例如:

  • <cpp_out>/addressbook.h

类型生成

消息生成带类型化访问器和字节辅助方法的 final 类:

class Person final {
public:
class PhoneNumber final {
public:
const std::string& number() const;
std::string* mutable_number();
template <class Arg, class... Args>
void set_number(Arg&& arg, Args&&... args);

fory::Result<std::vector<uint8_t>, fory::Error> to_bytes() const;
static fory::Result<PhoneNumber, fory::Error> from_bytes(
const uint8_t* data, std::size_t size);
static fory::Result<PhoneNumber, fory::Error> from_bytes(const std::vector<uint8_t>& data);
};

const std::string& name() const;
std::string* mutable_name();
template <class Arg, class... Args>
void set_name(Arg&& arg, Args&&... args);

const Animal& pet() const;
Animal* mutable_pet();
};

可选消息字段生成 has_xxxmutable_xxxclear_xxx API:

class Envelope final {
public:
bool has_payload() const { return payload_ != nullptr; }
const Envelope::Payload& payload() const { return *payload_; }
Envelope::Payload* mutable_payload() {
if (!payload_) {
payload_ = std::make_unique<Envelope::Payload>();
}
return payload_.get();
}
void clear_payload() { payload_.reset(); }

private:
std::unique_ptr<Envelope::Payload> payload_;
};

联合生成 std::variant 包装器:

class Animal final {
public:
enum class AnimalCase : uint32_t {
DOG = 1,
CAT = 2,
};

static Animal dog(Dog v);
static Animal cat(Cat v);

AnimalCase animal_case() const noexcept;
uint32_t animal_case_id() const noexcept;

bool is_dog() const noexcept;
const Dog* as_dog() const noexcept;
Dog* as_dog() noexcept;
const Dog& dog() const;
Dog& dog();

template <class Visitor>
decltype(auto) visit(Visitor&& vis) const;

private:
std::variant<Dog, Cat> value_;
};

生成的头文件包含用于序列化元数据的 FORY_UNIONFORY_ENUMFORY_STRUCT 宏。 字段和载荷配置嵌入生成的 FORY_STRUCT/FORY_UNION 条目中。

注册

生成的注册函数:

inline void register_types(fory::serialization::BaseFory& fory) {
fory.register_union<Animal>(106);
fory.register_enum<Person::PhoneType>(101);
fory.register_struct<Person::PhoneNumber>(102);
fory.register_struct<Person>(100);
fory.register_struct<Dog>(104);
fory.register_struct<Cat>(105);
fory.register_struct<AddressBook>(103);
}

对于没有显式 [id=...] 的 Schema,生成的注册代码使用计算得到的数字 ID:

fory.register_enum<Status>(1124725126);
fory.register_union<Wrapper>(1471345060);
fory.register_struct<Envelope>(3022445236);
fory.register_union<Envelope::Detail>(1609214087);
fory.register_struct<Envelope::Payload>(2862577837);

如果设置了 option enable_auto_type_id = false;

fory.register_struct<Config>("myapp.models.Config");
fory.register_union<Holder>("myapp.models.Holder");

使用方式

addressbook::Person person;
person.set_name("Alice");
*person.mutable_pet() = addressbook::Animal::dog(addressbook::Dog{});

auto bytes = person.to_bytes();
auto restored = addressbook::Person::from_bytes(bytes.value());

gRPC 服务配套代码

使用 --grpc 时,C++ 会生成 <stem>.service.h<stem>.service.grpc.h<stem>.service.grpc.cc。API 头文件在 ::<namespace>::service 下包含同步接口和路由常量;绑定头文件包含生成的 grpc::SerializationTraits 以及位于 ::<namespace>::service::grpc 下的客户端和服务端包装器。构建和使用指南请参阅 C++ gRPC