std :: vector <> :: size_type을 인쇄하는 방법?
std::vector회원 유형이 size_type있습니다. printf 형식 지정자는 무엇입니까?
와 size_type동일하지 않습니다 size_t.
https://en.cppreference.com/w/cpp/container/vector
https://en.cppreference.com/w/cpp/types/size_t
https://en.cppreference.com/w/cpp/io/c/fprintf
답변
printf 형식 지정자는 무엇입니까?
아무도 모른다. std::vector<?>::size_type"unsigned integer type"int C ++ Container Library, General container requirements를 제외하고 정확히 무엇인지 지정되지 않았습니다 . printf형식 지정자는 유형에 따라 다르기 때문에 모두 특정 구현에 따라 다릅니다. printf형식 지정자가 존재하지 않을 수도 있습니다 .
std :: vector <> :: size_type을 인쇄하는 방법?
단계에서 :
printf형식에 따라 형식 지정자 를 가져 오는 라이브러리를 만듭니다 .- 해당 유형의 라이브러리 템플릿.
std::cout::operator<<어쨌든 인쇄에 과부하가 발생 하는 것과 같습니다 . 다만:
#include <cstdlib>
#include <string>
#include <cstdio>
#include <vector>
template<typename T> constexpr const char *get_printf_formatting_spec() noexcept;
template<> constexpr const char *get_printf_formatting_spec<std::size_t>() noexcept {
return "zu";
}
template<> constexpr const char *get_printf_formatting_spec<unsigned long long>() noexcept {
return "llu";
}
/// etc.
int main() {
const auto fmt = std::string() +
"%" +
get_printf_formatting_spec<std::vector<int>::size_type>() +
"\n";
std::printf(fmt.c_str(), static_cast<std::vector<int>::size_type>(1));
}
겸손하고 실용적인 해킹
다른 답변에서 알 수 있듯이 우아하고 직접적인 방법은 없습니다. 그러면 어떻게해야합니까? 더 나은 접근 방식이없는 경우 겸손하고 기본으로 돌아 갑시다.
- 가능한 가장 큰 (크기별) 부호있는 정수 유형과 부호없는 정수 유형에 대한 printf 형식 지정자를 찾으십시오.
- 컴파일 타임에를
size_type사용 하여 벡터의 부호를 확인합니다std::is_signed_t<T>. - 런타임에 크기 값이 대상 유형에 맞을만큼 작은 지 확인하십시오. 그렇지 않으면 실패를 선언하십시오.
size_type적절한 정수 유형으로 캐스트하십시오 .- 이제 printf 호출에서 캐스트 값을 사용할 수 있습니다.
추신-부호있는 / 부호없는 형식 지정자 중에서 선택하려면 형식 문자열을 동적으로 구성하거나 두 형식 문자열 중에서 선택하거나 조건부 컴파일 등을 사용해야합니다. 대신 가장 큰 부호있는 형식으로 이동하여 항상 캐스팅 할 수 있습니다. 로 그 - 그 마지막 비트를 필요로하는 가장 큰 크기에 실패의 가격.