C++2a(C++20)標準ライブラリに導入される コンセプト(concept) の名前付けガイドラインについて。
2019年Cologne会合にて (PDF)P1754R1 が採択され、Ranges TS提案当初から PascalCase
形式で検討されていた命名規則から snake_case
形式へと変更された。これにより従来C++標準ライブラリとの一貫性は向上したが、その名前のみからはコンセプトなのかクラスやメタ関数*1なのかを判別しづらくなっている。*2
提案文書P1851R0では、P1754R1から改善した下記ガイドラインを提案している。
- コンセプト名は
snake_case
形式とする。 - コンセプトを示す接頭辞(prefix)/接尾辞(suffix)は使わない。
- コンセプトの目的に応じた3つのカテゴリ:特性(Capabilities)、抽象(Abstrations)、その他の述語(predicate)
- 特性コンセプト(capability concept):ある関数/メンバ関数呼び出しが可能といった単一要件で構成される。
- 特性コンセプトの名前は、その要件を説明する形容詞(adjective)とする。
- 要求する特性が関数のとき、そのコンセプト名には関数名に
-ible
や-able
接尾辞をつけたものとする。例:swap
可能を要求するswappable
, コピー構築可能を要求するcopy_constructible
- 抽象コンセプト(abstract concept):複数要件から構成されたりコンセプト構成のルートにあたるハイレベル・コンセプト。
- 抽象コンセプトの名前は、新しい専門用語(terminology)を導入する名詞(noun)とする。例:
forward_iterator
(要件を列挙しただけのhas_increment_equality_and_dereference
はNG) - 抽象コンセプトの名前は、同コンセプトを満たす型の名前よりも総称的(general)であること。
- 抽象コンセプトの名前は、新しい専門用語(terminology)を導入する名詞(noun)とする。例:
- その他の述語コンセプト:下記に該当する場合は、型トレイツ(type traits)の命名規則に従う。ただし
is_
接頭辞はつけない。- 主に複数の型引数をとり型制約に利用されるときは、適切な前置詞(preposition)で終わる名前とする。例:
swappable_with
,same_as<int>
,constructible_with<args>
,sentinel_for<iterator>
- 主に別コンセプトの定義やrequires節で利用されるときは、前置詞(preposition)は付けない。例:
swappable
,mergeable
- 主に複数の型引数をとり型制約に利用されるときは、適切な前置詞(preposition)で終わる名前とする。例:
関連URL