Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages

  
 
  

home | help
std::format_kind(3)	      C++ Standard Libary	   std::format_kind(3)

NAME
       std::format_kind	- std::format_kind

Synopsis
	  Defined in header <format>
	  template< class R >
	  inline  constexpr  /*	 unspecified  */  format_kind =	/* unspecified
       (1) (since C++23)
	  */;
	  template< ranges::input_range	R >

	      requires	       std::same_as<R,	       std::remove_cvref_t<R>>
       (2) (since C++23)

	  inline constexpr range_format	format_kind<R> = /* see	description
	  */;

	  The	variable   template   format_kind   selects   an   appropriate
       std::range_format for a
	  range	R.

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

	    *	  If	 std::same_as<std::remove_cvref_t<ranges::range_refer-
       ence_t<R>>, R> is true,
	      std::format_kind<R> is std::range_format::disabled.
	    * Otherwise, if R::key_type	is valid and denotes a type:
		 * If R::mapped_type is	valid and denotes a type, let U	be
		   std::remove_cvref_t<ranges::range_reference_t<R>>.

	  If  either  U	is a specialization of std::pair or U is a specializa-
       tion of std::tuple
	  and	 std::tuple_size_v<U>	 ==    2,    std::format_kind<R>    is
       std::range_format::map.
	    *
		 * Otherwise, std::format_kind<R> is std::range_format::set.
	    * Otherwise, std::format_kind<R> is	std::range_format::sequence.

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

	  Given	a  cv-unqualified  program-defined  type  T  that  models  in-
       put_range, a program can
	  spcialize format_kind	for T. Such specializations are	usable in con-
       stant
	  expressions, and have	type const std::range_format.

Possible implementation
       namespace detail	{
	   template< typename >
	   inline constexpr bool is_pair_or_tuple_2 = false;

	   template< typename T, typename U >
	   inline constexpr bool is_pair_or_tuple_2<std::pair<T, U>> = true;

	   template< typename... Ts >
	   inline   constexpr	bool  is_pair_or_tuple_2<std::tuple<Ts...>>  =
       sizeof...(Ts) ==	2;

	   template < typename T >
	       requires	std::is_reference_v<T> || std::is_const_v<T>
	   inline constexpr bool is_pair_or_tuple_2<T> =
	       is_pair_or_tuple_2<std::remove_cvref_t<T>>; }

       template< class R > inline constexpr range_format format_kind = [] {
	   static_assert(false,	"instantiating a primary template is  not  al-
       lowed");
	   return range_format::disabled; }();

       template< ranges::input_range R >
	   requires  std::same_as<R,  std::remove_cvref_t<R>> inline constexpr
       range_format format_kind<R> = []	{
	   if		      constexpr			(std::same_as<std::re-
       move_cvref_t<std::ranges::range_reference_t<R>>,	R>)
	       return range_format::disabled;
	   else	if constexpr (requires { typename R::key_type; })
	   {
	       if constexpr (requires {	typename R::mapped_type; } &&
			     detail::is_pair_or_tu-
       ple_2<std::ranges::range_reference_t<R>>)
		   return range_format::map;
	       else
		   return range_format::set;
	   }
	   else
	       return range_format::sequence; }();

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_for-
       mat::sequence);
	static_assert(std::format_kind<std::map<int>>	 ==    std::range_for-
       mat::map);
	static_assert(std::format_kind<std::set<int>>	 ==    std::range_for-
       mat::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() {}

See also
	  range_format specifies how a range should be formatted
	  (C++23)      (enum)

http://cppreference.com		  2024.06.10		   std::format_kind(3)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=std::format_kind&sektion=3&manpath=FreeBSD+Ports+15.1.quarterly>

home | help