Movatterモバイル変換


[0]ホーム

URL:


cppreference.com
Namespaces
Variants
    Actions

      std::format_kind

      From cppreference.com
      <cpp‎ |utility‎ |format
       
       
       
      Formatting library
      Standard format specification
      Formatting functions
      (C++20)
      (C++20)
      (C++20)
      (C++20)
      Format strings
      Formatting concepts
      Formatter
      (C++20)
      format_kind
      (C++23)
      Formatting arguments
      (C++20)(deprecated in C++26)
      Format error
       
      Defined in header<format>
      template<class R>
      constexpr/* unspecified */ format_kind=/* unspecified */;
      (1)(since C++23)
      template<ranges::input_range R>

          requiresstd::same_as<R,std::remove_cvref_t<R>>

      constexpr range_format format_kind<R>=/* see description */;
      (2)(since C++23)

      The variable templateformat_kind selects an appropriatestd::range_format for a rangeR.

      std::format_kind<R> is defined as follows:

      If eitherU is a specialization ofstd::pair orU is a specialization ofstd::tuple andstd::tuple_size_v<U>==2,std::format_kind<R> isstd::range_format::map.
      • Otherwise,std::format_kind<R> isstd::range_format::set.
      • Otherwise,std::format_kind<R> isstd::range_format::sequence.

      A program that instantiates the primary template of theformat_kind variable template is ill-formed.

      Given a cv-unqualifiedprogram-defined typeT that modelsinput_range, a program can specializeformat_kind forT. Such specializations are usable in constant expressions, and have typeconststd::range_format.

      [edit]Possible implementation

      namespace detail{template<typename>constexprbool is_pair_or_tuple_2=false; template<typename T,typename U>constexprbool is_pair_or_tuple_2<std::pair<T, U>>=true; template<typename T,typename U>constexprbool is_pair_or_tuple_2<std::tuple<T, U>>=true; template<typename T>        requiresstd::is_reference_v<T>||std::is_const_v<T>constexprbool is_pair_or_tuple_2<T>=        is_pair_or_tuple_2<std::remove_cvref_t<T>>;} template<class R>constexpr range_format format_kind=[]{    static_assert(false,"instantiating a primary template is not allowed");return range_format::disabled;}(); template<ranges::input_range R>    requiresstd::same_as<R,std::remove_cvref_t<R>>constexpr range_format format_kind<R>=[]{ifconstexpr(std::same_as<std::remove_cvref_t<std::ranges::range_reference_t<R>>, R>)return range_format::disabled;elseifconstexpr(requires{typename R::key_type;}){ifconstexpr(requires{typename R::mapped_type;}&&                      detail::is_pair_or_tuple_2<std::ranges::range_reference_t<R>>)return range_format::map;elsereturn range_format::set;}elsereturn range_format::sequence;}();

      [edit]Example

      Run this code
      #include <filesystem>#include <format>#include <map>#include <set>#include <vector> struct A{}; static_assert(std::format_kind<std::vector<int>>== std::range_format::sequence);static_assert(std::format_kind<std::map<int,int>>== std::range_format::map);static_assert(std::format_kind<std::set<int>>== std::range_format::set);static_assert(std::format_kind<std::filesystem::path>== std::range_format::disabled);// ill-formed:// static_assert(std::format_kind<A> == std::range_format::disabled); int main(){}

      [edit]See also

      specifies how a range should be formatted
      (enum)[edit]
      Retrieved from "https://en.cppreference.com/mwiki/index.php?title=cpp/utility/format/format_kind&oldid=183223"

      [8]ページ先頭

      ©2009-2025 Movatter.jp