本

本

Lucid C++ C++の輪郭 C++23入門 コンテナ編

C++23入門シリーズのコンテナ編。言語編の上に、標準ライブラリのコンテナ・アルゴリズム・スマートポインタと、値を表す optional・expected・variant・any を据える。

記事

記事

std::vector<bool>とC++20コンセプト

std::vector<bool> の特殊性 突然ですがstd::vector<bool>はご存知でしょうか。 std::vectorクラステンプレートの特殊化の一つで、boolをそのまま配列としてしまうと空間効率が悪いために特別な実装とすることが実装者に推奨されています。 std::vector<bool>の実装詳細については他に譲りますが、とにかく通常のstd::vector<T>とはそのインターフェースが異なります。 通常std::vector<T>::referenceはT&と等しいですが、std::vect...

記事

C++26リフレクションでつくる tuple と variant

はじめに この記事は C++ Advent Calendar 2025 9 日目の記事となります。 C++26 には静的リフレクション(P2996R13 Reflection for C++26)が採択されました。 この変更は今まで行われてきたメタプログラミングを凌駕する表現の可能性を秘めています。 magic_enum 相当の処理が標準の範囲内でできるようになるということは既に有名かもしれません。 既存の tuple や variant 本題に入る前に、既存の tuple や variant がどのように実装されてきたのかを見ていきたいと思います。 tuple まずは tu...

記事

std::type_orderによる型リストの正規化

std::type_order について C++26 において std::type_order クラステンプレートが導入されます[1]。これは2つの型を取って std::strong_ordering を返すようなメタ関数であり、ユーザー定義型を含めあらゆる型に対し処理系定義の一貫した順序付けを行うものです。 struct A {}; struct B {}; constexpr std::strong_ordering ord = std::type_order<A, B>::value; // 処理系定義の値 これまでにも std::type_info による実行時...

記事

concat_view の内部実装について

はじめに まだ GCC しか std::ranges::concat_view を実装していない 2024 年 09 月頃、ある人の要望とひょんな思いつきから自作ライブラリに concat_view の実装を生やすことになりました。 本記事は実装にあたって気になったり面白いと思ったりした箇所に関する覚書となります。 概要 concat_view は複数の view を連結するレンジアダプタで、受け取った view たちを std::tuple で内部的に保持し[1]、イテレータはそれぞれの view のイテレータを std::variant で持ち[1:1]つつ走査していきます。...

記事

C++26 の std::execution の概念まとめ [WIP]

概要 P2300 std::execution がついに C++26 入りしたとのことで、自分のためにもどういった設計になっているのかを用語を整理しながら見ていこうと思います。 CPO の種別について std::execution には多くの CPO (customization point object) が登場しますが、どうやらそれらには種別があるようです(規格書にも下記と同様の表が載っています) 種別 説明 具体例 core std::execution の機能のコアとなる start, connect completion functions se...

記事

メタ関数のカリー化

序文 メタ関数をカリー化したい、と誰もが一度は思うはず[1]です。 なので早速やっていきます。 メタ関数の作成 まずやりたい事を明確にします。カリー化というぐらいですから、以下のように書きたいですね。 template <class T, class U> struct X {}; using curried = curry<X>::type; static_assert(std::is_same<curried<T><U>, X<T, U>>::value); しかし curried<T>&lt...