yohhoyの日記

技術的メモをしていきたい日記

std::monostate as a Unit Type

C++標準ライブラリで提供されるstd::monostateは、単一値しか持たない ユニット型(Unit type) としても利用できる。*1

2024-11-29追記:C++2c(C++26)に向けて提案文書(PDF)P0472R3が採択され、ヘッダ<utility>にも汎用部品としてstd::monostateが追加される。*2

std::monostateはデフォルト構築可能でコピー操作や比較演算全般をサポートする正則な(regular)型であり*3、クラステンプレート特殊化を必要とするvoid型よりも自然に「情報を持たない」ことを表現できる。*4

#include <concepts>
#include <variant>

static_assert(std::regular<std::monostate>);
static_assert(not std::regular<void>);  // voidは非正則

関連URL

*1:C++17以降のヘッダ<variant>中にて定義され、本来は std::variant<std::monostate, Types...> のように空(empty)ステートを表現するためのクラス。

*2:https://github.com/cplusplus/papers/issues/1993

*3:ある型が正則(regular)となるには、==, != 演算子による等値比較のみ可能であればよい。std::monostate は等値比較以外にも大小比較やハッシュ演算をサポートする。

*4:例:std::future<T> は結果型を持たない std::future<void> 特殊化を提供する。