yohhoyの日記

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

C++標準コンセプトの名前付けガイドライン

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)であること。
  • その他の述語コンセプト:下記に該当する場合は、型トレイツ(type traits)の命名規則に従う。ただしis_接頭辞はつけない。
    • 主に複数の型引数をとり型制約に利用されるときは、適切な前置詞(preposition)で終わる名前とする。例:swappable_with, same_as<int>, constructible_with<args>, sentinel_for<iterator>
    • 主に別コンセプトの定義やrequires節で利用されるときは、前置詞(preposition)は付けない。例:swappable, mergeable

関連URL

*1:標準ヘッダ <type_traits> で提供される、ある型の特性(traits)をコンパイル時に判別するテンプレート関数群。

*2:P1754R1では変更根拠として、PascalCase はドメイン固有のエンティティ名として用いられるケースが多いことと、アプリケーションコードでの using namespace std; 利用によって生じる名前衝突回避を挙げている。