在 std::unique_ptr 类成员上流式传输
ostream on a std::unique_ptr class member
我想打印一个 std::unique_ptr 它是 Bar 的类成员。但是,以下代码不起作用,请参阅我对流 <<bar.foo_unique() 的评论;我想我应该更改我的 foo_unique() 访问器,但我不知道如何。
#include <iostream>
#include <memory>
class Foo
{
public:
Foo() : n_(1) {}
int n() const { return n_; }
private:
int n_;
};
std::ostream& operator<< (std::ostream& stream, const Foo& foo);
std::ostream& operator<< (std::ostream& stream, const Foo& foo)
{
stream << foo.n();
return stream;
}
class Bar
{
public:
Bar() : m_(2), foo_(), foo_unique_(std::make_unique<Foo>()) {}
int m() const { return m_; }
const Foo& foo() const { return foo_; }
const std::unique_ptr<Foo>& foo_unique() const { return foo_unique_; } // what to return here ?
private:
int m_;
Foo foo_;
std::unique_ptr<Foo> foo_unique_;
};
std::ostream& operator<< (std::ostream& stream, const Bar& bar);
std::ostream& operator<< (std::ostream& stream, const Bar& bar)
{
stream << bar.m() << ",";
stream << bar.foo();
// stream << bar.foo_unique(); // does not work !!!
return stream;
}
int main()
{
Bar bar;
std::cout << bar << std::endl;
}
我怎样才能正确地做到这一点?
编辑:我想要流<<bar.foo_unique(); 具有与流<<bar.foo() 相同的行为;
没有为std::unique_ptr<T>
定义输出运算符:这有点可悲,但许多C++类缺少输出运算符。最简单的方法是只打印指针:
stream << bar.foo_unique().get();
如果要打印实际指针,或者取消引用指针
stream << *bar.foo_unique();
如果您想打印足尖。
要使用输出运算符,您可以创建自己的输出运算符,假设Foo
是用户定义的类型,std::unique_ptr<Foo>
。您可以将其放入与定义Foo
相同的命名空间中:
std::ostream& operator<< (std::ostream& out, std::unique_ptr<Foo> const& foo) {
return out << *foo; // or foo.get()depending on what you want to get printed
}
没有从 std::unique_ptr<T>
到 T const&
的隐式转换,这会阻止确定流插入运算符。不过,您在这里有几个选择。第一个选项是为std::unique_ptr<T>
提供一次operator<<
覆盖,为T&
提供一次覆盖。如果您同时使用std::unique_ptr
和非拥有原始指针或引用,这可能会变得乏味。第二个选项是提供单个模板化版本的operator<<
来处理std::unique_ptr<T>
的实例,然后提供单个版本来处理T const&
。下面是如何实现此目的的示例。
std::ostream& operator<< (std::ostream& out, Foo const& arg)
{
// output stuff here
return out;
}
template<class T>
std::ostream& operator<< (std::ostream& out, std::unique_ptr<T> const& arg)
{
return out << *arg;
}
相关文章:
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 对RValue对象调用的LValue ref限定成员函数
- 为什么使用 "this" 指针调用派生成员函数?
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 助记符和指向成员语法的指针
- 用于访问容器<T>数据成员的正确 API
- 内置函数可查看CPP中的成员变量
- 是否可以初始化不可复制类型的成员变量(或基类)
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 嵌套在类中时无法设置成员数据
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 将函数类成员映射到类本身内部
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 将Ref对象作为类成员
- 将包含C样式数组的对象初始化为成员变量(C++)
- 静态数据成员的问题-修复链接错误会导致编译器错误
- 将公共但非静态的成员函数与ALGLIB集成
- 将数据从构造函数传输回调用方法时更改数据成员
- 在 std::unique_ptr 类成员上流式传输