C++ 如何打印std::vector<>;::尺寸和类型?
C++ 如何打印std::vector<>;::尺寸和类型?,c++,printf,c++14,std,C++,Printf,C++14,Std,std::vector具有成员类型size\u type。它的printf格式说明符是什么 请注意,size\u type与size\u t不同 在printf中使用的选项是%zu 这是从C99开始使用的。在需要将类型强制转换为无符号long之前,在printf中使用的选项是%zu 这是从C99开始使用的。在您需要将类型强制转换为unsigned long之前 它的printf格式说明符是什么 没人知道。它没有指定std::vector::size\u type的确切含义,只是它是一个“无符
std::vector
具有成员类型size\u type
。它的printf格式说明符是什么
请注意,size\u type
与size\u t
不同在
printf
中使用的选项是%zu
这是从C99开始使用的。在需要将类型强制转换为
无符号long
之前,在printf
中使用的选项是%zu
这是从C99开始使用的。在您需要将类型强制转换为unsigned long
之前
它的printf格式说明符是什么
没人知道。它没有指定std::vector::size\u type的确切含义,只是它是一个“无符号整数类型”int。因为printf
格式说明符取决于类型,所以它完全取决于特定的实现。也可能不存在printf
格式说明符
如何打印std::vector::size\u type
分步骤:
printf
格式说明符std::cout::operator完全相同
它的printf格式说明符是什么
没人知道。它没有指定std::vector::size\u type的确切含义,只是它是一个“无符号整数类型”int。因为printf
格式说明符取决于类型,所以它完全取决于特定的实现。也可能不存在printf
格式说明符
如何打印std::vector::size\u type
分步骤:
创建一个库以根据类型获取printf
格式说明符
在该类型上创建该库的模板
这和std::cout::operator一个卑微的实用黑客一样
正如其他答案所表明的那样,似乎没有优雅、直截了当的方法来做到这一点。那怎么办呢?由于缺乏更好的方法,让我们保持谦虚,回到基础:
查找可以使用的最大(按大小)有符号和无符号整数类型的printf格式说明符
在编译时,使用std::is\u signed\u t
确定向量size\u type
的符号性
在运行时,检查大小值是否足够小,以适合目标类型,否则只声明失败
将size\u类型
强制转换为适当的整数类型
现在可以在printf调用中使用cast值
PS-要在有符号/无符号格式说明符之间进行选择,您需要动态构造格式字符串,或者在两个格式字符串之间进行选择,或者使用条件编译等,您可以选择最大的签名类型,并始终使用该类型,但代价是无法获得需要最后一位的最大大小的签名类型。一个谦逊的实用黑客
正如其他答案所表明的那样,似乎没有优雅、直截了当的方法来做到这一点。那怎么办呢?由于缺乏更好的方法,让我们保持谦虚,回到基础:
查找可以使用的最大(按大小)有符号和无符号整数类型的printf格式说明符
在编译时,使用std::is\u signed\u t
确定向量size\u type
的符号性
在运行时,检查大小值是否足够小,以适合目标类型,否则只声明失败
将size\u类型
强制转换为适当的整数类型
现在可以在printf调用中使用cast值
PS-要在有符号/无符号格式说明符之间进行选择,您需要动态构造格式字符串,或者在两个格式字符串之间进行选择,或者使用条件编译等,您可以选择最大的签名类型,并始终将其转换为最大的签名类型,代价是无法获得需要最后一位的最大大小。如何找到?阅读文档,使用google等。C++11及更高版本的%z
格式对应于std::size\u t
(与C99及更高版本的%z
对应于size\u t
)。严格地说,std::vector::size\u type
是否与std::size\u t
相同是由实现定义的,但我还没有遇到一个不是这样的实现。在C++11(和C99)之前,必须在检查值是否在范围内后转换为另一个整数类型(如长无符号
)。实际上,在C++中,最好使用C++流(通过函数重载正确地处理代码< SigeZtt < /Cord>)一种选择是将其转换为<代码> UnTimeSt*T<<代码>或<代码> STD::sisixt t//> >(不确定它是否足够大以容纳<代码> STD::vector::siZeHype类型< /C>).@Peter谢谢你提供的信息和建议的解决方法。@Peter这是%zu
@Bob_uuu。我更改了复制目标。现在看起来是正确的。如何找到?阅读文档,使用google等。C++11及更高版本的%z
格式对应于std::size\u t
(与C99及更高版本的%z
对应于size\u t
)。严格地说,std::vector::size\u type
是否与std::size\u t
相同是由实现定义的,但我还没有遇到一个不是这样的实现。在C++11(和C99)之前,必须在检查值是否在范围内后转换为另一个整数类型(如长无符号
)。实际上,在C++中,最好使用C++流(通过函数重载正确地处理代码< SigeZtt < /Cord>)一种选择是将其转换为<代码> UnTimeSt*T<<代码>或<代码> STD::sisixt t//> >(不确定它是否足够大以容纳<代码> STD::vector::siZeHype类型< /C>).@Peter谢谢你提供的信息和建议的解决办法。@Peter是%zu
@Bob_uu。我更改了du
#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));
}