有没有办法在不使用命名空间 std 或前缀 std:: 的情况下引用 cout?
Is there a way to reference cout without using namespace std or prefixing with std::?
我对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();
}
- 如果 std::vector::clear() 不是静态的,如何在没有实例的情况下调用它?
- 在没有未定义行为的情况下实现类似std::vector的容器
- 如何在没有死锁和/或争用的情况下正确使用 std::mutex C++?
- C++标准是否允许<double>在没有开销的情况下实现 std::可选
- 在这种情况下显式调用时,std::cout 如何更改析构函数的行为?
- 为什么在以下情况下我需要使用 std::d ecay?
- 如何在没有 std::move 的情况下移动临时对象
- 在不使用模板的情况下获取 std::array 引用
- 如何在不使用 std::tm 和 mktime() 的情况下为给定日历日期创建 chrono::time_point 对
- 如何在给定 std::variant 的情况下检索模板参数包?
- 有没有办法在不使用命名空间 std 或前缀 std:: 的情况下引用 cout?
- 在不使用vector.end()的情况下迭代std::vector
- 为什么std::atomic中的所有成员函数都同时出现在有volatile和没有volatile的情况下
- 如何从 std::optional 中获取 QByteArray<QByteArray>,并在没有其他 malloc 的情况下保留 std::nullopt?
- 默认情况下,"std::shared_ptr"不应该使用"std::d efault_delete"吗?
- 推荐的方法在不初始化值的情况下使数组类型为 std::unique_ptr?
- 在运行时,何时完全初始化 std 库才能在不破坏代码的情况下使用它?
- 如何在没有迭代器的情况下使用 std::for_each + std::execution::p ar?
- 是否有可能在没有复制的情况下传递 std::vector<int> 作为参数来获得 std::vector<std::array<int, 3>>?
- std::regex 是否保证了最坏情况下的时间复杂度?