前沿
自从了解了 nlohmann::json c++项目写起来也感觉很舒服了.
本文主要解决的问题为:
你有一个 c++ 的类或结构体,里面有很多配置的变量需要赋值. 你的配置写在 json 文件中,且json 文件有很多个 object, 每个object都可能有c++类需要的变量,如何比较方便地进行赋值.
比如你的类如下
class Data{
public:
int v1;
string v3;
vector<int> v4;
...
...
int v50;
};
json 文件如下
{
"task1":{
"v1": 1,
...
},
"task2":{
"v4": [1,2,3,4,5],
....
},
....
解决方案
- 第一步自然是要使你 c++ 变量的名字和 json 文件中的名字一致
- 第二步是写一个通用的赋值函数, 这个函数只有遇到有这个变量的时候才进行赋值
template <typename T>
bool get_value(const nlohmann::json &j, const string & nm, T& val){
//if(j[nm].empty()) return false;
if(j.find(nm) == j.end()) return false;
else{
j.at(nm).get_to(val);
return true;
}
}
- 最后用脚本语言生成类似如下的代码
void set_info_params(const nlohmann::json &j){
get_value(j, "v1", info.v1);
get_value(j, "v2", info.v2);
......
}
这段代码可以多次调用,传入不同的json object
给出我任务中用到的ruby 脚本
def gen1(nm)
return "get_value(j, \"#{nm}\", #{nm});"
end
def gen2(nm)
return "get_value(j, \"#{nm}\", info.#{nm});"
end
nms=%w[
bool issave_img;
vector<int> check_range;
string flm;
string fpm;
int n_lm;
int n_exp;
int n_dim_full;
string fnm;
string imgdir;
string suffix;
string fn_each3d;
string fdense3d;
string ftrans_s_t;
string fpm_new;
int rot;
float scale;
]
for nm in nms
next unless nm[-1]==";"
nm = nm.split(";")[0]
puts gen1 nm
end