跳到主要内容

C++ 集成指南

本文介绍如何在原生 C++ 工程中使用 xres-code-generator 生成配置读取代码,并展示生成后的核心接口。

模板准备

REPO_DIR=$PATH_TO_xres_code_generator
mkdir -p "$REPO_DIR/sample/pbcpp"
cp -rvf "$REPO_DIR/template/common/cpp/"* "$REPO_DIR/sample/pbcpp"

若希望将生成文件放入子目录,可结合 --set cpp_include_prefix=config/excel/ 之类的参数来控制 #include 路径。

生成命令

PYTHON_BIN="$(which python3 2>/dev/null || which python)"
"$PYTHON_BIN" "$REPO_DIR/xrescode-gen.py" \
-i "$REPO_DIR/template" \
-p "$REPO_DIR/sample/sample.pb" \
-o "$REPO_DIR/sample/pbcpp" \
-g "$REPO_DIR/template/config_manager.h.mako" \
-g "$REPO_DIR/template/config_manager.cpp.mako" \
-g "$REPO_DIR/template/config_easy_api.h.mako" \
-g "$REPO_DIR/template/config_easy_api.cpp.mako" \
-l "H:$REPO_DIR/template/config_set.h.mako" \
-l "S:$REPO_DIR/template/config_set.cpp.mako" \
"$@"

运行示例

#include "config_manager.h"
#include "config_easy_api.h"

int main() {
excel::config_manager::me()->init();
// 可自行设置版本、日志、加载回调
// excel::config_manager::me()->set_buffer_loader(...);
excel::config_manager::me()->reload();

auto cfg = excel::get_role_upgrade_cfg_by_id_level(10001, 3);
if (cfg) {
printf("%s\n", cfg->DebugString().c_str());
}
return 0;
}

核心接口

config_manager

生成的 config_manager 负责生命周期、热更与事件注册:

class config_manager {
public:
using read_buffer_func_t = std::function<bool(std::string&, const char* path)>;
using read_version_func_t = std::function<bool(std::string&)>;
using on_not_found_func_t = std::function<void(const on_not_found_event_data_t&)>;

int init(bool enable_multithread_lock = true);
int reload();
void set_buffer_loader(read_buffer_func_t fn);
void set_version_loader(read_version_func_t fn);
void set_group_number(size_t sz);
void set_on_not_found(on_not_found_func_t func);
const config_group_ptr_t& get_current_config_group();
};

config_easy_api

每张表都会对应一组便捷函数,支持多索引读取:

namespace excel {
EXCEL_CONFIG_LOADER_API const excel_config_type_traits::shared_ptr<config_group_t>&
get_current_config_group() noexcept;

EXCEL_CONFIG_LOADER_API std::size_t get_role_upgrade_cfg_version();

EXCEL_CONFIG_LOADER_API excel_config_type_traits::shared_ptr<
const std::vector<excel_config_type_traits::shared_ptr<const ::role_upgrade_cfg>>>
get_role_upgrade_cfg_by_id(uint32_t Id);

EXCEL_CONFIG_LOADER_API excel_config_type_traits::shared_ptr<const ::role_upgrade_cfg>
get_role_upgrade_cfg_by_id_level(uint32_t Id, uint32_t Level);
}

config_set_role_upgrade_cfg

内部还会生成 config_set_role_upgrade_cfg,负责维护 IdIdLevelIdCosttype 等索引字典并在 reload 时填充,用于支持线程安全的只读查询。