簡體   English   中英

如何 printf std::vector<>::size_type?

[英]How to printf std::vector<>::size_type?

std::vector有一個成員類型size_type 它的 printf 格式說明符是什么?

請注意, size_typesize_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格式說明符。

如何 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));
}

一個不起眼的實用技巧

正如其他答案所建議的那樣,似乎沒有優雅、直接的方法來做到這一點。 那怎么辦? 由於缺乏更好的方法,讓我們謙虛 go 回到基礎:

  1. 查找 printf 格式說明符,用於最大(按大小)有符號和無符號 integer 類型。
  2. 在編譯時,使用std::is_signed_t<T>確定向量size_type的符號。
  3. 在運行時,檢查大小值是否足夠小以適合目標類型,否則就宣告失敗。
  4. size_type轉換為適當的 integer 類型。
  5. 您現在可以在 printf 調用中使用轉換值。

PS - 要在有符號/無符號格式說明符之間進行選擇,您需要動態構造格式字符串,或者在兩個格式字符串之間進行選擇,或者使用條件編譯等。相反,對於最大的有符號類型,您可以只使用 go 並始終強制轉換進入那個- 以需要最后一點的最大尺寸失敗為代價。

printf中使用的選項是%zu

這是從 C99 使用的。 在您需要將類型轉換為unsigned long之前。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM