【问题标题】:Is there a way to reference cout without using namespace std or prefixing with std::?有没有办法在不使用命名空间 std 或前缀 std:: 的情况下引用 cout?
【发布时间】:2019-01-14 07:09:04
【问题描述】:

我是 C++ 的新手,我使用 std::cout 进行调试。

不过,我真的希望能够只使用 cout 而不是整个 std::cout 东西。我知道我可以导入 std 命名空间,但有人解释说这是一件坏事,因为这可能会发生名称冲突。

有没有办法做到这一点?

我试过了

std::ostream cout = std::cout;

但我明白了

function "std::basic_ostream<_CharT, _Traits>::basic_ostream(const std::basic_ostream<_CharT, _Traits> &) [with _CharT=char, _Traits=std::char_traits<char>]" (declared at line 391 of "/usr/include/c++/5/ostream") cannot be referenced -- it is a deleted function

请提出建议。

【问题讨论】:

  • 首选std::cout
  • 对不起,为什么?
  • 因为它是C++中的最佳实践,引入整个std命名空间是bad practice
  • 是的,但我实际上只是想介绍命名空间的一些元素(coutendl 之类的东西),正如我在帖子中所说的那样。
  • @Ron 没有范围的using 声明被认为是一种不好的做法。在函数或块中包含using std;using std::cout; 通常并没有什么坏处。根据具体情况,有些人可能会争辩说,即使在 .cc/.cpp 文件中没有作用域的 using 也可以,因为它不会影响其他编译单元(尽管我个人更愿意避免这种情况)。跨度>

标签: c++ cout


【解决方案1】:

当然,using declaration:

using std::cout;

关于不在头文件中执行此操作并将其限制在小范围内的常见健康警告适用。

【讨论】:

  • 谢谢,我想这正是我想要的!
  • 另外,“导入”ostream 类型的推荐方法是什么?我应该使用typedef std::ostream ostream 还是using std::ostream
  • @ThomasKowalski 你不能在 C++ 中“导入”东西,至少现在还不能。您需要做的是包含适当的标题。我可能会使用如上所示的 using 声明,但仅限于实现文件中,并且范围有限。但总的来说,我大部分时间只写std::
  • @ThomasKowalski:在这里提及#include <iosfwd> 可能会有用。如果您只需要std::ostream 声明,则不需要所有<ostream>
【解决方案2】:

你不能复制流(想一想,它只是没有意义),但你可以获得对它们的引用:

std::ostream& my_cout = std::cout;

但是,我强烈建议您不要这样做。如果您在某些代码中看到std::cout,您几乎可以 100% 确定您知道它是什么。另一方面,单独的cout 应该已经让你看起来很可疑,而my_cout 真的可以是任何东西。我知道这很难,但习惯于输入std::,从长远来看,它对您的帮助将超过您输入这 5 个字母所需的时间。

【讨论】:

    【解决方案3】:

    你的方法是:

    auto& cout = std::cout;
    

    但你可能只是这样做

    using std::cout;
    

    (与 using namespace 类似的限制:不在 header 中的 namespace 范围内,理想情况下尽可能限制 using 指令的范围)

    【讨论】:

      【解决方案4】:

      抱歉,评分太低,无法发表评论,但你为什么不直接输入

      using std::cout;
      

      在文件顶部,然后使用cout。 附言也回复this post

      【讨论】:

      • 无论您的代表如何,这应该是一个答案而不是评论。在 cmets 中回答很诱人,但它绕过了审查和投票,这对于使 SO 工作至关重要
      【解决方案5】:

      一种方法是using-declaration,它只引入std::cout而不是std::中的所有名称:

      using std::cout;
      

      您尝试的方式行不通 - 尝试将 std::cout 复制到另一个对象 - 而 std::cout 不可复制。

      替代方法是使用参考:

      std::ostream& cout = std::cout;
      

      现在,cout 指向 std::cout 而不是它的副本。

      第二种方法很有用,例如,如果你想编写一个函数而不决定它是否应该输出到cout、文件或其他东西:

      void func(std::ostream& output) {
          output << "works with cout, files, etc.";
      }
      

      【讨论】:

      • 轻微的挑剔:cout 并没有真正“指向”std::cout。恕我直言,说cout is std::cout 更正确,因为引用只是别名
      【解决方案6】:

      如果您希望缩写为 std::cout,那么您真正需要的是依赖注入。

      请记住,std::cout 是对 std::ostream 模型的引用。

      我们可以利用它来使代码更具可重用性、可测试性和松散耦合。

      示例:

      #include <iostream>
      #include <sstream>
      
      std::ostream& do_something(std::ostream& os)
      {
          os << "Hello, World!\n";
          return os;
      }
      
      
      int main()
      {
          // inject std::cout
          do_something(std::cout);
      
          // inject a stringstream
          std::ostringstream ss;
          do_something(ss);
          std::cout << ss.str();
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多