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

[2023年](https://qiita.com/prickle/items/ac6aee295b8f0ba93007)に続いて今年も2024年にお世話になったライブラリのうち、あまりメジャーでも定番でもないライブラリをリストアップさせていただきました。

私の中でのC++の立ち位置は相変わらず「雑に作れて、かなり速い」なので、堅牢なシステムでの利用には耐えられないかもしれませんが、何かのご参考になれば。

## [Glaze](https://github.com/stephenberry/glaze) - JSONの読み書き
| 項目             | 値             |
| :----------------: | -------------- |
| ライブラリ種別   | ヘッダオンリー |
| C++バージョン    | 23             |
| ライセンス       | MIT            |
| スター数         | 1516            |
| 2024年リリース回数 | 105回           |

今年も一番お世話になったライブラリです。
もう「メジャーなライブラリ」といっても良い気がしています。
Partial Read/Writeによる柔軟な読み書き、JSON-RPCやJMESPathへの対応など沢山の機能が追加され、更なる高速化も達成されています。

### 良い点
- Partial ReadやCustom Read Functionsで柔軟なフィールドの読み込みができる
- 構造体やクラスだけでなくSTLコンテナもJSONとの直接読み書きができる
- 中間データに独自バイナリ形式を利用してさらに高速化できる

### いまいちな点
- AVX512が使える環境だと[simdjson](https://simdjson.org/)より30%ぐらい遅い
- 最後のフィールドのカンマやコメントなど特殊なJSONには対応していない
- version 3.0.0以降はC++23が必要になった

### 代替ライブラリ
個人的にRyzen7 7700を使うようになってAVX512がまがりなりにも使えるので、[simdjson](https://simdjson.org/)や[Jsonifier](https://github.com/RealTimeChris/Jsonifier)の方が明確に速く動作するようになりました。
AVX512ネイティブなRyzen9000番台を使うとさらに差が広がりそうなので、Glazeとの併用を続けようと思っています。

## [ssp](https://github.com/red0124/ssp) - CSV読み書き
| 項目             | 値             |
| :----------------: | -------------- |
| ライブラリ種別   | ヘッダオンリー |
| C++バージョン    | 17             |
| ライセンス       | MIT            |
| スター数         | 51            |
| 2024年リリース回数 | 5回           |

2024年もCSVとの関係は腐れ縁のように続きました。2025年も必要になりそうです。
2023年は[commata](https://github.com/furfurylic/commata)というライブラリを重用していたのですが、最近はsspを使うことが多いです。
[Boost.Mp11](https://github.com/boostorg/mp11)で都合のよいstd::tupleを作成して、これをテンプレートパラメータに渡すとそれに沿ったパースをしてくれるのが便利です。

### 良い点
- フィールドごとの型を指定して簡潔に読み込みができる
- void型を指定することでフィールドの読み飛ばしができる
- fast_floatを利用しているので浮動少数点型の処理が高速

### いまいちな点
- フィールド数が膨大だと巨大なstd::tupleになってしまいコードが冗長になる
- Glazeみたいにstructにマッピングできるとうれしい

### 代替ライブラリ
純粋にCSVパーザとしては[commata](https://github.com/furfurylic/commata)が代替になるのですが、記述が冗長になってしまうので高速な動作を求めない限り積極的に使う理由がなくなってしまいました。

## [Quill](https://github.com/odygrd/quill) - 高速多機能なログ出力
| 項目             | 値             |
| :----------------: | -------------- |
| ライブラリ種別   | ヘッダオンリー |
| C++バージョン    | 17             |
| ライセンス       | MIT            |
| スター数         | 1857            |
| 2024年リリース回数 | 25回           |

テキストベースのログを直接出力するロギングライブラリとして2024年も大活躍してくれました。
version 4.4.0でコンパイル時間を短縮できたこともあって、ヘッダーオンリーになっています。
継続した開発で機能追加と高速化がされていてありがたいです。

### 良い点
- ログがテキスト形式なものの中では高速に動作する
- 柔軟なログ出力構成やログローテート設定が定義できる
- コンソール出力では色がついて見やすくなった

### いまいちな点
- あいかわらずAPIが時々変更になり泣くことがある
- ログローテートで古いログが削除されない(はず)

### 代替ライブラリ
Quillで不満を感じることがほぼないので他のライブラリをほぼ使わない一年でした。
せいぜいOpenTelemetry Protocolを利用するために[OpenTelemetry C++](https://github.com/open-telemetry/opentelemetry-cpp)を利用するぐらいでしょうか。

## [ThorVG](https://github.com/thorvg/thorvg) - 2Dグラフィックライブラリ
| 項目             | 値             |
| :----------------: | -------------- |
| ライブラリ種別   | 静的・動的ライブラリ |
| C++バージョン    | 14             |
| ライセンス       | MIT            |
| スター数         | 808            |
| 2024年リリース回数 | 39回           |

多機能な2Dグラフィックライブラリです。
この用途では[Blend2D](https://blend2d.com/)を使っていたのですが、「点線が描けない」という弱点があり、ThorVGを使うことが増えました。

### 良い点
- 点線が描画できる
- Lottieアニメーションに対応している
- GPUを利用した描画にも対応している

### いまいちな点
- もうすぐAPI互換性のない1.0がリリースされる
- 今のところドキュメントが少ない
- 画像ファイルへの出力が弱い

### 代替ライブラリ
ソフトウェアで高速に動作させたいなら[Blend2D](https://blend2d.com/)か、SVGに寄っていますが軽量な[LunaSVG](https://github.com/sammycage/lunasvg)を使うことがあります。

## [Rapid YAML](https://github.com/biojppm/rapidyaml/) - 高速なYAML読み書きライブラリ
| 項目             | 値             |
| :----------------: | -------------- |
| ライブラリ種別   | 静的・動的ライブラリ |
| C++バージョン    | 11             |
| ライセンス       | MIT            |
| スター数         | 597            |
| 2024年リリース回数 | 4回           |

やっと私もYAMLを扱うことが増えてきてライブラリを頻繁に利用するようになりました。
2024年は2年ぶりぐらいにリリースされて、新機能も追加されてありがたかったです。

### 良い点
- 私が使う範囲では他のライブラリより高速に動作する
- ふつうのYAMLであれば困らず使える

### いまいちな点
- ちょっと書く量が冗長になりがち
- Glazeのようなstructとのバインディングがない
- また開発が2年ぐらい止まるかもしれない

### 代替ライブラリ

一般的なのは[yaml-cpp](https://github.com/jbeder/yaml-cpp)でしょうか。
Rapid YAMLよりもAPIが簡単に使えるように設計されていて便利ですが、処理速度が気になるのでRapid YAMLを使うことが多いです。

## [simple_enum](https://github.com/arturbac/simple_enum) - 便利なenum
| 項目             | 値             |
| :----------------: | -------------- |
| ライブラリ種別   | ヘッダーオンリー |
| C++バージョン    | 20             |
| ライセンス       | BSL-1.0            |
| スター数         | 25            |
| 2024年リリース回数 | 11回           |

2023年は[Magic Enum C++](https://github.com/Neargye/magic_enum)を利用していましたが、C++20,23への対応状況からsimple_enumを使うことが多くなりました。
2024年に開発が開始されたばかりの若いライブラリです。

### 良い点
- C++20, 23への対応に積極的
- glazeとの連携機能がある
- コンパイル時間が短くなる場合がある

### いまいちな点
- まだ若いライブラリなので不安

### 代替ライブラリ
特にこだわりがなければ[Magic Enum C++](https://github.com/Neargye/magic_enum)で十分だとは思います。こちらも開発が続いています。

## [libxlsxwriter](https://github.com/jmcnamara/libxlsxwriter) - xlsxファイルの書き込み
| 項目             | 値             |
| :----------------: | -------------- |
| ライブラリ種別   | 静的・動的ライブラリ |
| C++バージョン    | C言語             |
| ライセンス       | BSD-2-Clause            |
| スター数         | 1547            |
| 2024年リリース回数 | 4回           |

2024年も「ちょっとした見える化したい」という用途で大活躍してくれました。
2年ぶりにリリースされたのがありがたいです。

### 良い点
- 数式やセルのマージ、オートフィルターなど大抵の機能が実現できる
- 画像やグラフの書き込みができる、画像の位置固定もできるようになった
- 巨大なファイルの書き込みへの対応機能がある

### いまいちな点
- シェイプ、スパークラインなどの最近の機能に対応していない (golangの[excelize](https://github.com/qax-os/excelize)が羨しい)
- 読み込みには一切対応していないのでセルは値とフォーマットを同時に設定しないといけない

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

## [wildcards](https://github.com/zemasoft/wildcards) - ワイルドカードでのマッチング
| 項目             | 値             |
| :----------------: | -------------- |
| ライブラリ種別   | ヘッダーオンリー |
| C++バージョン    | C++11             |
| ライセンス       | BSL-1.0            |
| スター数         | 80            |
| 2024年リリース回数 | 0回           |

正規表現を使うまでもないパターンマッチを実現することが多くで良く利用しました。
正規表現は無理でもワイルドカードは案外すんなり理解できる人は多いので、色々な人に使ってもらうツールでは重宝しました。

### 良い点
- 関数の引数がテンプレート化されているのでstd::string_viewとかも渡せる
- 軽量ですぐに使える

### いまいちな点
- たぶんもうメンテナンスされていない

### 代替ライブラリ
std::string_viewでも使えるライブラリを他に見つけられていません。

## メジャーでお世話になったライブラリ
蛇足ながら定番なライブラリでお世話になったものを上げておきます。
開発者に感謝。

|ライブラリ名|ライセンス|用途|
|-|-|-|
| [Apache Arrow](https://arrow.apache.org/) | Apache-2.0 | 主にparquetの読み書きとデータ処理で |
| [Boost.Unordered](https://github.com/boostorg/unordered) | BSL-1.0 | 大抵の場合で最速のunordered_mapとして |
| [Boost.MP11](https://github.com/boostorg/mp11) | BSL-1.0 | sspとの組み合わせで |
| [Catch2](https://github.com/catchorg/Catch2) | BSL-1.0 | 単体テストのフレームワーク |
| [curl](https://curl.se/) | MIT | HTTP, SFTP, IMAPの通信全般 |
| [fast_float](https://github.com/fastfloat/fast_float) | MIT, Apache-2.0, BSL-1.0 | 文字列から浮動小数点の変換 |
| [{fmt}](https://github.com/fmtlib/fmt) | MIT | std::printの機能強化版として | 
| [SQLite](https://sqlite.org/) | public domain| 手軽にRDBを使いたい時に |

## 終わりに
2023年と比べると新しいライブラリが出てくる頻度が減った気がして少し悲しいです。
とはいえ久しぶりに開発が再開されたライブラリがあったり、既存ライブラリのC++20/23化だったり、古いライブラリで今でも使えるものを発見したりと、まだまだ楽しめる余地は沢山あるなと気がつかされた一年でした。

2025年もまだまだC++で楽しませてもらおうと思います。
私は引き続きconanのレシピ作成で微力ながら貢献させてもらうつもりです。