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
- (PDF)P0472R2 Put std::monostate in <utility>
- Why is C++'s void type only half-heartedly a unit type? - Stack Overflow
- cppreference std::regular, cpprefjp std::regular
- std::monostateのハッシュ値 - yohhoyの日記
*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> 特殊化を提供する。