我无法存储std::cout
在std::shared_ptr<std::ostream>
.
因为这显然不应该这样做:
std::shared_ptr<std::ostream> p_cout(&std::cout);
这甚至是不可能的,因为无法复制 std::ostream:
std::shared_ptr<std::ostream> p_cout = std::make_shared<std::ostream>(std::cout);
有人知道合法的解决方法吗?
我无法存储std::cout
在std::shared_ptr<std::ostream>
.
因为这显然不应该这样做:
std::shared_ptr<std::ostream> p_cout(&std::cout);
这甚至是不可能的,因为无法复制 std::ostream:
std::shared_ptr<std::ostream> p_cout = std::make_shared<std::ostream>(std::cout);
有人知道合法的解决方法吗?
您的要求很奇怪,但是您当然可以std::ostream
在shared_ptr<std::ostream>
提供的内容中存储一个指向的指针,您需要处理适当的处理程序操作:例如:std::shared_ptr<std::ostream>(&std::cout, [](void*) {});
这显然不应该这样做:
std::shared_ptr<std::ostream> p_cout(&std::cout);
事实上,这绝不应该这样做。原因是因为您没有所有权,std::cout
因此当您的最后一个shared_ptr
超出范围时,它会尝试删除std::cout
(这显然是邪恶的)。但你已经知道了。
如果您必须绝对使用 a shared_ptr
(我认为这是 API 兼容性问题),解决方案是使用不执行任何操作的自定义删除器:
shared_ptr<std::ostream> p_cout(&std::cout, [](std::ostream*){});
shared_ptr 将获得您给它的指针的所有权。这意味着您的程序最终将尝试删除 std::cout (当初始 shared_ptr 的最后一个副本超出范围时)。这不是你想做的事情。
由于您不需要控制 std::cout 的生命周期,您可以简单地传递一个 std::ostream 原始指针或引用。