[英]How to printf 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
格式說明符。
如何 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));
}
一個不起眼的實用技巧
正如其他答案所建議的那樣,似乎沒有優雅、直接的方法來做到這一點。 那怎么辦? 由於缺乏更好的方法,讓我們謙虛 go 回到基礎:
std::is_signed_t<T>
確定向量size_type
的符號。size_type
轉換為適當的 integer 類型。PS - 要在有符號/無符號格式說明符之間進行選擇,您需要動態構造格式字符串,或者在兩個格式字符串之間進行選擇,或者使用條件編譯等。相反,對於最大的有符號類型,您可以只使用 go 並始終強制轉換進入那個- 以需要最后一點的最大尺寸失敗為代價。
在printf
中使用的選項是%zu
。
這是從 C99 使用的。 在您需要將類型轉換為unsigned long
之前。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.