[英]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();
如果您想打印出指示對象。
要使用輸出運算符,您可以使用std::unique_ptr<Foo>
來創建自己的輸出運算符,假設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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.