天天看點

BOOST.JSON庫的學習筆記(一)

#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是否正确。友善調試代碼。運作時,這個斷言可能就不起作用了。

繼續閱讀