std:: format_kind
|
헤더 파일에 정의됨
<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
>>
|
(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
변수 템플릿의 기본 템플릿을 인스턴스화하는 프로그램은
형식이 잘못되었습니다.
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, "기본 템플릿을 인스턴스화하는 것은 허용되지 않습니다"); 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, 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); // 잘못된 형식: // static_assert(std::format_kind<A> == std::range_format::disabled); int main() {}
참고 항목
|
(C++23)
|
범위의 서식 지정 방식을 지정함
(열거형) |