有没有一种方法可以在不使用命名空间std或添加前缀std::的情况下引用cout?

5

我对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

请给予建议。


3
建议使用std::cout - Ron
请问,为什么? - Thomas Kowalski
因为在C++中,这是最佳实践,并且引入整个std命名空间被认为是糟糕的实践。 - Ron
是的,但我实际上只是想介绍一些命名空间的元素(例如coutendl之类的东西),正如我在帖子中所述。 - Thomas Kowalski
1
@Ron 不良实践是未加作用域的 using 声明。在函数或一般块内部使用 using std;using std::cout; 并没有什么不好的。而且根据情况,有些人可能会认为即使在 .cc/.cpp 文件中使用未加作用域的 using 也没问题,因为它不会影响其他编译单元(尽管我个人更喜欢避免这种情况)。 - jdehesa
6个回答

15

当然可以,使用using声明

using std::cout;

通常的健康警告是不要在头文件中这样做,并将其限制在小范围内。


谢谢,我觉得那正是我在寻找的! - Thomas Kowalski
另外,"import" ostream 类型的推荐方式是什么?我应该使用 typedef std::ostream ostream 还是 using std::ostream - Thomas Kowalski
1
@ThomasKowalski 在C++中你不能直接“导入”东西,至少目前还不能。你需要做的是包含适当的头文件。我可能会像上面所示使用using声明,但只在实现文件中和有限的范围内使用。但一般来说,我大部分时间都写std:: - juanchopanza
1
@ThomasKowalski:在这里提到 #include <iosfwd> 可能会很有用。如果你只需要 std::ostream 的声明,那么你就不需要所有的 <ostream> - MSalters

7

你不能复制流(想想看,这根本没有意义),但是你可以获取对它们的引用:

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

然而,我强烈建议你不要这样做。如果你在代码中看到std::cout,你几乎可以肯定知道它是什么。另一方面,一个单独的cout应该会让你感到怀疑,而my_cout可能真的是任何东西。我知道这很难,但习惯输入std::,从长远来看,它比你需要输入那5个字母更有帮助。


4
您的方法是:

您的方式将是:

auto& cout = std::cout;

但你可能只需要这样做。
using std::cout;

(与使用命名空间类似的限制:不能在头文件的名称空间范围内,最好尽可能地限制使用指令的范围)

2

很抱歉,您的评分过低,无法发表评论。但为什么不直接输入呢?

using std::cout;

在文件顶部加上cout,然后直接使用它即可。 附注:也可以在此帖子中找到答案。

1
无论您的声望如何,这应该是一个答案而不是评论。在评论中回答很诱人,但它会绕过审查和投票,这对于使SO工作至关重要。 - 463035818_is_not_a_number

0
一种方法是使用声明(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就是std::cout,因为引用只是一个别名。 - 463035818_is_not_a_number

0
如果您想要缩写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();
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接