format_format_kind
format_format_kind (범위 서식 종류 선택)
이 페이지는 C++23에서 추가된 std::format_kind 변수 템플릿을 설명해요. 이 템플릿은 범위(range) R에 적합한 std::range_format 값을 제공해서, std::format이 범위를 어떻게 서식화할지 결정하는 데 사용돼요. 프로그램 정의 타입에 대해 특수화할 수도 있어요.
출처: cppreference
본문
<format> 헤더에 정의됨 |
||
|---|---|---|
template < class R > constexpr /* unspecified */ format_kind = /* unspecified */ ; |
(1) | (C++23부터) |
template < ranges :: input_range R > requires std :: same_as < R , std :: remove_cvref_t < R >> constexpr range_format format_kind < R > = /* see description */ ; |
(2) | (C++23부터) |
변수 템플릿 format_kind는 범위 R에 적합한 std::range_format을 선택해요.
std::format_kind<R>은 다음과 같이 정의돼요.
- 만약
std::same_as<std::remove_cvref_t<ranges::range_reference_t<R>>, R>가true라면,std::format_kind<R>은std::range_format::disabled예요. - 그렇지 않고,
R::key_type이 유효하고 타입을 나타낸다면:R::mapped_type이 유효하고 타입을 나타낸다면,U를std::remove_cvref_t<ranges::range_reference_t<R>>라고 할게요.U가std::pair의 특수화이거나,U가std::tuple의 특수화이면서std::tuple_size_v<U> == 2라면,std::format_kind<R>은std::range_format::map이에요.- 그렇지 않다면,
std::format_kind<R>은std::range_format::set이에요.
- 그렇지 않다면,
std::format_kind<R>은std::range_format::sequence예요.
format_kind 변수 템플릿의 기본 템플릿을 인스턴스화하는 프로그램은 ill-formed예요.
cv 한정이 없는 프로그램 정의 타입 T가 input_range를 모델링한다면, 프로그램은 T에 대해 format_kind를 특수화할 수 있어요. 이러한 특수화는 상수 표현식에서 사용할 수 있고, 타입은 const std::range_format이에요.
가능한 구현
namespace detail { template < typename > constexpr bool is_pair_or_tuple_2 = false ; template < typename T , typename U > constexpr bool is_pair_or_tuple_2 < std :: pair < T , U >> = true ; template < typename T , typename U > constexpr bool is_pair_or_tuple_2 < std :: tuple < T , U >> = true ; template < typename T > requires std :: is_reference_v < T > || std :: is_const_v < T > constexpr bool 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 > requires std :: same_as < R , std :: remove_cvref_t < R >> constexpr range_format format_kind < R > = [] { if constexpr ( std :: same_as < std :: remove_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_tuple_2 < std :: ranges :: range_reference_t < R >> ) return range_format :: map ; else return range_format :: set ; } else return range_format :: sequence ; }();
예제
#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>> == 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() {}
같이 보기
range_format (C++23) |
범위를 어떻게 서식화할지 지정하는 열거형 [편집] |
|---|