• Class / Function / Type

      std::
    • Header file

      <>
    • Other / All

    最終更新日時(UTC):
    が更新

    履歴 編集

    concept
    <concepts>

    std::regular

    namespace std {
      template<class T>
      concept regular = semiregular<T> && equality_comparable<T>;
    }
    

    概要

    regularは、任意の型Tsemiregularコンセプトを満たし、それに加えて等値比較可能であることを表すコンセプトである。

    正則性

    正則(regular)な型とはつまり以下の性質を備えた型である。

    • ムーブ構築・代入可能
    • コピー構築・代入可能
    • デフォルト構築可能
    • swap可能
    • == !=による等値比較可能

    このような正則な型とは、int型などの基本型の様に扱うことのできる型を表している。

    ここから等値比較可能という性質を弱めたものは、半正則な型と呼ばれる。

    #include <iostream>
    #include <concepts>
    
    template<std::regular T>
    void f(const char* name) {
      std::cout << name << " is regular" << std::endl;
    }
    
    template<typename T>
    void f(const char* name) {
      std::cout << name << " is not regular" << std::endl;
    }
    
    
    struct regular {
      regular() = default;
      regular(const regular&) = default;
      regular& operator=(const regular&) = default;
    
      bool operator==(const regular&) const = default;
    };
    
    struct semiregular {
      semiregular() = default;
      semiregular(const semiregular&) = default;
      semiregular& operator=(const semiregular&) = default;
    };
    
    int main() {
      f<int>("int");
      f<double>("double");
      f<std::nullptr_t>("std::nullptr_t");
      f<std::size_t>("std::size_t");
      f<regular>("regular");
    
      std::cout << "\n";
      f<void>("void");
      f<semiregular>("semiregular");
    }
    

    出力

    int is regular
    double is regular
    std::nullptr_t is regular
    std::size_t is regular
    regular is regular
    
    void is not regular
    semiregular is not regular
    

    バージョン

    言語

    • C++20

    処理系

    関連項目

    参照