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