如何解决如何打印std :: vector <> :: size_type?
use strict ;
use warnings ;
# input to the state machine
my $din ;
#---------------------------------------------------------------------
# FSM's state table.
#---------------------------------------------------------------------
# Expected input sequence is:
# AA 99 00 01 ....
# In which:
# (1) Fixed pattern "AA" and "99" are two bytes of header,# (2) Following bytes are uart ID,etc.
my %next_state = (
"INIT" => sub{
# If receives "AA" from input,# then jumpt to "HEADER0" state:
$din eq "AA" and return "HEADER0" ; #(D)
# Otherwise just stay here:
return "INIT" ;
},"HEADER0" => sub{
# If receives "99" from input,# then proceed to "HEADER1" state:
$din eq "99" and return "HEADER1" ;
# Otherwise,return to initial state:
return "INIT" ;
},"HEADER1" => sub{
# Capture first byte of uart ID:
return "UARTID0";
},"UARTID0" => sub{
# Capture second byte of uart ID:
return "UARTID1";
},"UARTID1" => sub{
# Capture second byte of uart ID:
return "FINISHED";
},"FINISHED" => sub{
return "INIT";
},);
#---------------------------------------------------------------------
# Set state machine's initial state.
#---------------------------------------------------------------------
my $cur_state = "INIT" ;
#---------------------------------------------------------------------
# Send in command sequence
#---------------------------------------------------------------------
my @seq = (-1,0xAA,-1,0x99,0x00,0x0a,0x0b,0x0c,0x0d
);
sub get_next_byte {
while (@seq) { #(A)
my $cur_byte = shift(@seq);
return $cur_byte if $cur_byte >= 0;
#
sleep(-$cur_byte);
}
return (); #(B)
}
#---------------------------------------------------------------------
# Run the state machine.
#---------------------------------------------------------------------
# Integer for debugging purpose.
my $itgi = 0;
##--while( my ($din) = get_next_byte() ){ #(C)
while( ($din) = get_next_byte() ){ #(C)
$din = sprintf("%02X",$din);
$cur_state = $next_state{$cur_state}();
print "-- Iteration $itgi,will jump to: $cur_state\n";
$itgi++;
}
print "-- Program finish.\n";
的成员类型为std::vector
。它的printf格式说明符是什么?
请注意,size_type
与size_type
不同。
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
的确切含义,只是它是一个“无符号整数类型” 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调用中使用强制转换值。
PS-要在有符号/无符号格式说明符之间进行选择,您将需要动态构造格式字符串,或者在两个格式字符串之间进行选择,或者使用条件编译等。相反,您可以选择最大的带符号类型并始终以 that 的形式投放-失败的代价是需要最后一点的最大尺寸。
,在printf
中使用的选项是%zu
。
这是从C99使用的。在需要将类型强制转换为unsigned long
之前。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。