COSCUP 2023

C++ boost hana的分析以及在資料處理上的應用
2023-07-29, 10:10–10:40 (Asia/Taipei), TR 213
Language: Traditional Chinese (Taiwan)

C++11之後,標準委員會多次強化了template的功能,導入了varadic pack, auto, fold expression等語法,大大提昇了STL的應用範圍。本議程將會導讀boost library中的hana,並講解這些功能的可能應用。內容包括了hana type computation的概念,也就是如何在C++中對class本身進行運算;以及hana struct,讓使用者對自己寫的class加上更多資訊,讓compiler得以運用這些資訊展開struct,降低我們需要寫的程式碼數量。

在資料處理,如轉換文字以及C++ struct的時候(yaml, argparse, json, protobuf),這樣struct展開相當有用,作者自己也拿相同技術運用在硬體開發中的Verilog的輸出資料分析。傳統上高階語言如Python由於弱型別特性,此類應用場景使用起來會比C++等很強型別簡易許多。然而有了這樣的技術之後,我們便能享受到C++的效率以及高階語言的好用性。


本議程包含了示範環節,在示範環節中,我們將會用20行程式碼實現上述hana boost最核心精神,示範將你的C++任意的struct,僅僅補上一行code,就能同時搖身一變成為json printer以及argument parser。且要同時達到這兩個功能,完全不需要任何的一次性(write-only)程式碼,我們也將會解釋前面提到的搖身一變的魔法,也就是如何寫一個header file,就能告訴標準compiler自動用template展開幫你寫出printer/parser內部的內容。而且完完全全不需要使用到一般的 JSON 或是 argument parser library(喔對了,當然也不是用chatgpt)。

這是「20行程式碼實現上述hana boost最核心精神」中,我會用到的範例 source code
https://github.com/johnjohnlin/namedtuple

裡面將會提及JSON, argument parser的實做。至於為什麼叫做namedtuple,這是因為其概念跟Python的namedtuple一樣。在C++11我們可以透過tuple.get<N>()這樣的API來取得tuple的第N元素,也能用recursive或是fold expression在compile展開,也可以透過overload讓不同型別的展開有不同的實做。然而跟Python有完全一樣的問題,tuple[N]這樣的語法擴展性極差,因此namedtuple將struct的每個member標記上兩個功能 get<N>()&get_string<N>() 回傳字串名稱,讓compiler可以用這兩者去展開出需要的程式碼。

技術細節上,為了讓程式更簡潔,namedtuple使用了「C++17 編譯期字串 string_view,fold expression」以及「C++14 自動回傳型別實做」,程式的自動展開用到了boost的preprocessor。


Difficulty

入門

Target Audience

對現代C++ template應用有興趣、或是想要拿C++來做通用資料處理的人