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

履歴 編集

concept
<concepts>

std::boolean(C++20)

namespace std {
  template<class B>
  concept boolean =
    movable<remove_cvref_t<B>> &&
    requires(const remove_reference_t<B>& b1,
             const remove_reference_t<B>& b2, const bool a) {
      { b1 } -> convertible_to<bool>;
      { !b1 } -> convertible_to<bool>;
      { b1 && b2 } -> same_as<bool>;
      { b1 &&  a } -> same_as<bool>;
      {  a && b2 } -> same_as<bool>;
      { b1 || b2 } -> same_as<bool>;
      { b1 ||  a } -> same_as<bool>;
      {  a || b2 } -> same_as<bool>;
      { b1 == b2 } -> convertible_to<bool>;
      { b1 ==  a } -> convertible_to<bool>;
      {  a == b2 } -> convertible_to<bool>;
      { b1 != b2 } -> convertible_to<bool>;
      { b1 !=  a } -> convertible_to<bool>;
      {  a != b2 } -> convertible_to<bool>;
    };
}

概要

booleanは、任意の型Bが真理値を表す型として使用可能であることを表すコンセプトである。

モデル

const remove_reference_t<B>型の左辺値b1, b2について以下の条件を満たす場合に限って、型Bbooleanのモデルである。

  • bool(b1) == !bool(!b1)
  • (b1 && b2), (b1 && bool(b2))及び(bool(b1) && b2)(bool(b1) && bool(b2))と等値であり、短絡評価されるかも同一である
  • (b1 || b2), (b1 || bool(b2))及び(bool(b1) || b2)(bool(b1) || bool(b2))と等値であり、短絡評価されるかも同一である
  • bool(b1 == b2), bool(b1 == bool(b2))及びbool(bool(b1) == b2)(bool(b1) == bool(b2))と等値である
  • bool(b1 != b2), bool(b1 != bool(b2))及びbool(bool(b1) != b2)(bool(b1) != bool(b2))と等値である

備考

bool, std::true_type, std::bitset<N>::reference等の型は真理値型としてbooleanコンセプトのモデルであるが、ポインタ型やスマートポインタ等の明示的にboolへ変換できるだけの型は真理値型ではなくbooleanコンセプトのモデルとならない。

#include <iostream>
#include <concepts>
#include <memory>
#include <type_traits>
#include <bitset>
#include <optional>

template<std::boolean T>
void f(const char* name) {
  std::cout << name << " is boolean" << std::endl;
}

template<typename T>
void f(const char* name) {
  std::cout << name << " is not boolean" << std::endl;
}


int main() {
  f<bool>("bool");
  f<int>("int");
  f<std::size_t>("std::size_t");
  f<std::true_type>("std::true_type");
  f<std::false_type>("std::false_type");
  f<std::bitset<8>::reference>("std::bitset<8>::reference");
  std::cout << "\n";
  f<int*>("int*");
  f<std::unique_ptr<int>>("std::unique_ptr<int>");
  f<std::shared_ptr<int>>("std::shared_ptr<int>");
  f<std::optional<int>>("std::optional<int>");
}

出力

bool is boolean
int is boolean
std::size_t is boolean
std::true_type is boolean
std::false_type is boolean
std::bitset<8>::reference is boolean

int* is not boolean
std::unique_ptr<int> is not boolean
std::shared_ptr<int> is not boolean
std::optional<int> is not boolean

バージョン

言語

  • C++20

処理系

関連項目

参照