configor icon indicating copy to clipboard operation
configor copied to clipboard

使用c++新标准

Open mingmoe opened this issue 3 years ago • 4 comments

我注意到README个段代码:

取值的同时判断类型
int n;
bool ret = j["boolean"].get_value(&n); // 若取值成功,ret 为 true

c++在新标准中已经对这种情况做出标准做法:使用std::optional.
修改成标准代码:

取值的同时判断类型
int n;
auto ret = j["boolean"].get_value(); // 若取值成功,ret 为 true
//get_value()应该返回std::optional<int>
if(ret.has_value()) n = ret.value();
else { /*do some thing*/}

如果没有什么特殊需求,都应该使用标准库中的方法.

mingmoe avatar Oct 10 '20 16:10 mingmoe

auto ret = j["boolean"].get_value(); 你这样写如何确认类型?

zekexiao avatar Oct 23 '20 03:10 zekexiao

对于已知类型,可以使用

optional<bool> ret_boolean = j["boolean"].get_boolean();
optional<string> ret_string = j["string"].get_string();
optional<double> ret_number = j["number"].get_number();

这样可以获取更高的确定性和可读性

如果你想使用泛型,可以用

std::variant<double,std::string,bool/*other type*/> ret_unknow_type = j["unknow type"].get_vulan();

这同样是来自标准库的方法

mingmoe avatar Oct 23 '20 04:10 mingmoe

貌似 README 里面的 bool ret = j["boolean"].get_value(&n); 方法不可用?编译不过 (我不是作者hhhh) optional<bool> ret_boolean = j["boolean"].get_boolean(); 这样确实可以 不过个人觉得 variant 没必要,j["unknow type"] 得到的 json_basic 本身就是泛型

zekexiao avatar Oct 26 '20 02:10 zekexiao

@chhdao 感谢建议,没有使用optional的原因是不想让这个库c++17起步,对用户的要求低一些,暂时保留这个issue吧

Nomango avatar Mar 09 '21 13:03 Nomango