std :: vector <> :: size_type을 인쇄하는 방법?

Oct 11 2020

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

답변

4 KamilCuk Oct 11 2020 at 20:55

printf 형식 지정자는 무엇입니까?

아무도 모른다. std::vector<?>::size_type"unsigned integer type"int C ++ Container Library, General container requirements를 제외하고 정확히 무엇인지 지정되지 않았습니다 . printf형식 지정자는 유형에 따라 다르기 때문에 모두 특정 구현에 따라 다릅니다. printf형식 지정자가 존재하지 않을 수도 있습니다 .

std :: vector <> :: size_type을 인쇄하는 방법?

단계에서 :

  1. printf형식에 따라 형식 지정자 를 가져 오는 라이브러리를 만듭니다 .
  2. 해당 유형의 라이브러리 템플릿.

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));
}
1 einpoklum Oct 12 2020 at 15:03

겸손하고 실용적인 해킹

다른 답변에서 알 수 있듯이 우아하고 직접적인 방법은 없습니다. 그러면 어떻게해야합니까? 더 나은 접근 방식이없는 경우 겸손하고 기본으로 돌아 갑시다.

  1. 가능한 가장 큰 (크기별) 부호있는 정수 유형과 부호없는 정수 유형에 대한 printf 형식 지정자를 찾으십시오.
  2. 컴파일 타임에를 size_type사용 하여 벡터의 부호를 확인합니다 std::is_signed_t<T>.
  3. 런타임에 크기 값이 대상 유형에 맞을만큼 작은 지 확인하십시오. 그렇지 않으면 실패를 선언하십시오.
  4. size_type적절한 정수 유형으로 캐스트하십시오 .
  5. 이제 printf 호출에서 캐스트 값을 사용할 수 있습니다.

추신-부호있는 / 부호없는 형식 지정자 중에서 선택하려면 형식 문자열을 동적으로 구성하거나 두 형식 문자열 중에서 선택하거나 조건부 컴파일 등을 사용해야합니다. 대신 가장 큰 부호있는 형식으로 이동하여 항상 캐스팅 할 수 있습니다. 로 - 그 마지막 비트를 필요로하는 가장 큰 크기에 실패의 가격.