【问题标题】:Does the C++ standard library have a templated getter for the printf conversion specifier?C++ 标准库是否有用于 printf 转换说明符的模板化 getter?
【发布时间】:2016-03-25 09:41:27
【问题描述】:

众所周知,如果由于某种原因您 printf() 某些东西而不是流式传输(这种情况很少,但有时可能会发生),您需要指定适当的格式说明符(d 用于带符号的 int,@987654323 @ 表示未签名等)。现在,由于printf() 是 C++ 标准库的一部分,而不仅仅是一些 C 遗产,我希望可能会有类似的东西

template <typename T> 
const std::string format_specifier;

这会允许,比如说:

template <typename Foo> 
void bar(const Foo& my_foo) {
    printf(format_specifier<Foo>, my_foo);
}

标准库是否包含类似的东西?

注意事项:

  • 请不要建议使用std::cout,当然这是你应该做的默认事情。我询问了标准库中的一个函数;如果将其从其中删除,您可以说“永远不应该使用它,所以您的问题无关紧要”。

【问题讨论】:

  • std::osteam(如std::cout)?
  • std::cout 怎么样?
  • 据我所知,它不存在。顺便说一句,您的示例必须在临时 std::string 上使用 c_str() 才能与 printf 兼容。
  • @Cornstalks:见编辑
  • @Shravan40:见编辑

标签: c++ c++-standard-library format-specifiers


【解决方案1】:

我最初是作为评论写的,因为它似乎太短了。

简短的回答是“否”,因为 C++ 标准没有指定任何此类设施。

由于向后兼容性(不允许重载,在全局命名空间和命名空间 std 中都允许等)以及鼓励使用 C++iostream 类的方式,给定函数的属性从 C 标准库继承,如果这样的功能被标准化,我会感到惊讶。

【讨论】:

    【解决方案2】:

    由于某些原因,它在 C++ 库中不存在。

    首先,如果您希望 C++ 帮助您找到输出对象的正确方法,C++ 为您提供stream 类上的注入器。流选择适当的转换器,并且可以通过使用操纵器进行调整 - 甚至可以通过重载 ostream&amp; operator &lt;&lt; (ostream&amp;, const T&amp;) 来指示如何打印任意对象。

    但另一方面,printf 格式字符串可以在其他语言(Python、Java)中使用,而且对于经常使用它的老程序员来说,它比 io 操纵器更容易使用。但它可以用在相当复杂的字符串中,混合不同类型的常量标签和变量:

    printf("Operation %-*s : %10.2f$ %2d%/02d\n", size, lib, val, dat->mday, dat->mon + 1);
    

    我真的无法想象一种轻松构建该字符串的方法(并且它不使用 alternate 变体 (#))

    因为它的存在主要是出于兼容性的原因——毕竟几乎所有的 C 标准库都可以从 C++ 中使用——我无法想象为什么它需要进一步集成。

    【讨论】:

      【解决方案3】:

      没有,但你可以很容易地编写代码,例如:

      template<typename T>
      char const *format_specifier(); 
      
      template<> inline char const *format_specifier<int>() { return "%d"; }
      
      // ... in function
      int d = 5;
      printf(format_specifier<decltype(d)>, d); 
      

      恕我直言,这非常粗暴,而且仍然容易出错。可能是为什么它不在标准库中。

      使用 printf 样式格式的更好解决方案是编码:

      my_printf("bla % bla % bla", arg1, arg2, arg3);
      

      % 只是从参数中获取正确的类型。您可以使用可变参数模板来做到这一点,并且已经有一些流行的实现。

      【讨论】:

        猜你喜欢
        • 2013-07-22
        • 2012-06-30
        • 2017-05-06
        • 2018-03-30
        • 1970-01-01
        • 2012-03-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多