2023年に特にお世話になったC++ライブラリ8選

「雑に作れて、かなり速い」というC++の特性は私にとってとてもありがたいものです。
2023年も隙さえあればC++でコードを書かせてもらいました。

一般には古い言語と言われているC++ですが、今でも新しいライブラリや既存ライブラリの更新が活発にされています。

2023年のコーディングでお世話になったライブラリのうち「定番ではないけれど広範囲にとても役にたった」というライブラリをリストアップさせていただきました。
新しいライブラリをお探しの方のご参考になれば幸いです。

## [Glaze](https://github.com/stephenberry/glaze) - JSONの読み書き

| 項目             | 値             |
| :----------------: | -------------- |
| ライブラリ種別   | ヘッダオンリー |
| C++バージョン    | 20             |
| ライセンス       | MIT            |
| スター数         | 732            |
| 2023年リリース回数 | 67回           |

たぶん2023年一番お世話になったライブラリです。
2022年まではsimdjsonをよく使っていたのですが、新規プロジェクトはGlazeばかり使っています。
開発が活発だし、ISSUEへの対応が速いのもありがたいです。

### 良い点

- SIMDを利用していないのにsimdjsonやyyjsonと遜色ない速度で動作する
- 構造体やクラスだけでなくSTLコンテナもJSONとの直接読み書きができる
- 中間データに独自バイナリ形式を利用してさらに高速化できる

### いまいちな点

- 長い文字列が多いJSONデータの読み込みではSIMDを使っているライブラリに対して不利になる
- 最後のフィールドのカンマやコメントの読み込みに対応していない
- ストリーム的な処理はない(と思う)

### 代替ライブラリ

似たようなアプローチでSIMDを使ってさらに速い[Jsonifier](https://github.com/RealTimeChris/Jsonifier)というライブラリがあります。
純粋な速度を求める場合にはこちらを使うことになりそうです。

## [commata](https://github.com/furfurylic/commata) - CSV読み書き

| 項目             | 値             |
| :----------------: | -------------- |
| ライブラリ種別   | ヘッダオンリー |
| C++バージョン    | 17             |
| ライセンス       | MIT            |
| スター数         | 5              |
| 2023年リリース回数 | 8回            |

いまだによく使われるCSVファイルの読み込みで大活躍しました。

### 良い点

- 一度に全部を読み込まず1行ずつに処理してくれる
- ダブルクオート内の改行にも対応している
- カスタマイズポイントが豊富で大抵の用途に対応できる

### いまいちな点

- マイナーすぎて不安
- glazeみたいにstructにマッピングできるとうれしい

### 代替ライブラリ

アプローチがだいぶ違いますが[ssp](https://github.com/red0124/ssp)も便利だと思います。

## [unordered_dense](https://github.com/martinus/unordered_dense) - std::unordered_map/setの代替

| 項目             | 値             |
| :----------------: | -------------- |
| ライブラリ種別   | ヘッダオンリー |
| C++バージョン    | 17             |
| ライセンス       | MIT            |
| スター数         | 618            |
| 2023年リリース回数 | 15回           |

std::unorder_set, std::unorder_mapの代替となるライブラリです。
データの持ち方の工夫で、たいていの用途でほぼ同速度、用途によっては明確に高速動作してくれます。

### 良い点

- 私が使っている限りではAPIは同一に使えていて、これのおかげで上のGlazeでのJSONとの読み書きにも対応しています
- std::unordered_ma/setの代替として安定して使える

### いまいちな点

- hash関数はもっと高速なものが出てきているので、毎回定義が面倒になってきた
- 順序を維持できるstd::map/setの代替が頻繁に欲しくなる

### 代替ライブラリ

[Abseil](https://github.com/abseil/abseil-cpp)や[folly](https://github.com/facebook/folly)などが提供するコンテナーも強力ですね。

## [Magic Enum C++](https://github.com/Neargye/magic_enum) - 便利なenum

| 項目             | 値               |
| :----------------: | -------------- |
| ライブラリ種別   | ヘッダーオンリー |
| C++バージョン    | 17            |
| ライセンス       | MIT              |
| スター数         | 4.1k             |
| 2023年リリース回数 | 6回               |

enumとenum classを便利にするユーティリティライブラリですね。
もう十分メジャーかもしれない…。

### 良い点

- enumと文字列との相互変換を楽に実現できるし、変換する文字列を(日本語などの)独自定義もできる
- enumでのflagの表現を手軽にできる機能がある

### いまいちな点

- 0.9.4でincludeパスが変わって変更が色々大変だった

### 代替ライブラリ

smart_enum, wise_enumがありますが、開発止まってしまってますね。

## [Quill](https://github.com/odygrd/quill) - 高速多機能なログ出力

| 項目             | 値                   |
| :----------------: | -------------- |
| ライブラリ種別   | 静的・動的ライブラリ |
| C++バージョン    | 17                |
| ライセンス       | MIT                  |
| スター数         | 984                  |
| 2023年リリース回数 | 17回                   |

最近はほぼログ出力と言えばほぼ一択でこれを使っています。
開発も比較的活発でありがたいです。

### 良い点

- ログがテキスト形式なものの中では高速に動作する
- 柔軟なログ出力構成やログローテート設定が定義できる

### いまいちな点

- まだAPIが安定しておらず、細かい修正をしないといけないリリースがときどきあって泣ける

### 代替ライブラリ

他のライブラリだと機能の豊富さとAPIの安定ならば[spdlog](https://github.com/gabime/spdlog)、高速な動作ならば[fmtlog](https://github.com/MengRao/fmtlog)が良いと思います。

## [freexl](https://www.gaia-gis.it/fossil/freexl/index) - xls/xlsxファイルの読み込み

| 項目             | 値                         |
| :----------------: | -------------- |
| ライブラリ種別   | 静的・動的ライブラリ       |
| C++バージョン    | C言語                      |
| ライセンス       | GPL-2.0, LGPL-2.1, MPL-1.0 |
| スター数         | githubレポジトリ無し       |
| 2023年リリース回数 | 1回                        |

まだまだ存在するxlsファイルを読み込めるライブラリです。
2023/07のリリースでxlsxファイルも読めるようになって読み込み全般に使えるようになりました。
ありがたい。

### 良い点

- xls, xlsx, odsファイルを1つのライブラリで読み込める

### いまいちな点

- xlsxの読み込みは別の関数を呼び出す必要がある
- xlsの読み込みが正しくない場合がある
- 図やオブジェクトの読み込みには対応していない

### 代替ライブラリ

xlsファイルの読み込みに対応しているライブラリでメンテナンスされているものを知らないです。

## [libxlsxwriter](https://github.com/jmcnamara/libxlsxwriter) - xlsxファイルの書き込み

| 項目             | 値                   |
| :----------------: | -------------- |
| ライブラリ種別   | 静的・動的ライブラリ |
| C++バージョン    | C言語                |
| ライセンス       | BSD-2-Clause         |
| スター数         | 1.3k                 |
| 2023年リリース回数 | 0回                  |

freexlの逆でxlsxファイルへの書き込み用のライブラリです。
活発とは言えませんがメンテナンスされているし、クセはありますがC言語ライブラリでは唯一の機能を提供してくれています。

### 良い点

- 数式やセルのマージ、オートフィルターなど大抵の機能が実現できる
- 画像やグラフの書き込みができる
- 巨大なファイルの書き込みへの対応機能がある

### いまいちな点

- シェイプ、スパークラインなどの最近の機能に対応していない (golangの[excelize](https://xuri.me/excelize/)が羨しい)
- セルは値とフォーマットを同時に設定しないといけない

### 代替ライブラリ

図やグラフが書けるC/C++ライブラリを他に見つけられていません。

## [blend2d](https://blend2d.com/) - 高速なベクター画像描画

| 項目             | 値                   |
| :----------------: | -------------- |
| ライブラリ種別   | 静的・動的ライブラリ |
| C++バージョン    | 11                   |
| ライセンス       | Zlib                 |
| スター数         | 1.4k                 |
| 2023年リリース回数 | 9回                  |

高速に動作する2次元ベクターグラフィックスライブラリです。
簡単なチャートを出したり、地図タイルに解析結果を描画したり、ちょっとしたデータの可視化にとても便利に使っています。

### 良い点

- 綺麗な画像を高速に生成できる
- FreeTypeに依存しない柔軟なフォント描画ができる

### いまいちな点

- 破線の曲線が(今のところ)描画できない
- リリースが分かりづらい

### 代替ライブラリ

[nanovg](https://github.com/memononen/nanovg)あたりが該当するのかなと思います。

## 終わりに

RustやGoに押されがちなC++ですが、未だに新しいライブラリも開発されてますし、C++17/20/23対応による既存ライブラリの使い勝手の向上も実感しています。
2024年も地味に進化してくれることを期待するばかりです。

わたしはconanパッケージを作成して少しでもお手伝いしようと思っています。