#include <boost/json.hpp>
using namespace boost::json;
int main(int argc, const char * argv[]) {
value jv = 3.12;
std::cout << to_string( jv.kind());
if (auto p = jv.if_double()) {
double d = *p;
std::cout << boost::json::serialize(jv);
}
if (jv.is_double()) {
std::cout << boost::json::serialize(jv);
}
jv.emplace_string() = "Hello, world!";
try {
jv.as_double() = 3.14;
}
catch (std::exception e) {
std::cout << e.what();
}
auto ref = jv.get_double();
return 0;
}
這一篇介紹value類。
可以簡單了解value類封裝了一個union。
Kind接口:
jv.kind() 傳回一個枚舉,可以根據這個枚舉值判斷value内部目前的存儲值類型
Emplacement接口:
emplace_xxx()函數,傳回一個xxx的引用。源碼有這句關鍵注釋:
changing the kind and replacing the contents (改變kind,替換内容)
Kind Test接口:
is_xxx()函數,傳回一個bool值。如果value目前存儲的東西符合xxx,則傳回true
Pointer Access接口:
if_xxx()函數,如果value目前存儲的東西符合xxx,則傳回xxx指針,否則傳回nullptr
Checked Access接口:
as_xxx()函數,如果value目前存儲的東西符合xxx,則傳回xxx的引用,否則抛異常。
它和emplace_xxx()有點像,都是傳回xxx的引用。差別是:as_xxx()不會改變目前kind和内容。
Unchecked Access接口:
get_xxx()函數,傳回xxx的引用。如同接口名字Unchecked所指,這個函數硬硬的傳回union的成員,而且不抛異常。假設目前union裡存的是double,我硬按照int64讀數,也能讀出來。
顯然,get_xxx()具有noexcept簽名,編譯出的代碼效率高于as_xxx()。
get_xxx()是具有assert斷言,判斷kind是否正确。友善調試代碼。運作時,這個斷言可能就不起作用了。