簡體   English   中英

std :: unique_ptr類成員上的ostream

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM