有没有办法在不使用命名空间 std 或前缀 std:: 的情况下引用 cout?



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

请指教。

当然,使用using 声明:

using std::cout;

有关不在头文件中执行此操作并将其限制为小范围的常见运行状况警告适用。

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

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

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

你的方式是:

auto& cout = std::cout;

但你可能只是这样做

using std::cout;

(限制与使用命名空间类似:不在标头的命名空间范围内,理想情况下尽可能限制使用指令的范围(

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

using std::cout;

在文件顶部,然后只需使用 cout . 附言也在这个帖子中回答

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

using std::cout;

您尝试的方式不起作用 - 这是尝试将std::cout复制到另一个对象 - 并且std::cout不可复制。

另一种方法是使用引用:

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

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

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

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

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

相关内容

最新更新