Перегрузка оператора потока << для указателя / общего указателя и других типов - PullRequest
2 голосов
/ 25 апреля 2019

Можно ли перегрузить оператор << для пользовательского класса таким образом, чтобы сработало все следующее: </p>

CustomClass customClass;
std::shared_ptr<CustomClass> sharedPointer(customClass);

os << customClass;
os << sharedPointer;

или что хотя бы следующие работы:

os << sharedPointer.get();

По умолчанию, используя общую технику для перегрузки operator, будут работать только следующие 2 опции:

os << customClass;
os << *sharedPointer.get();

Редактировать

«рабочий» здесь означает, что во всех случаях выполняется перегрузка оператора пользовательских классов << и что во всех случаях я получаю результат os << customClass вместо адресов указателей в случае классов указателей

Пример * * тысяча двадцать-один

Код:

os << customClass;
os << sharedPointer;
os << sharedPointer.get();
os << *sharedPointer.get();

Выход:

Custom class text
00000244125655C0
00000244125655C0
Custom class text

Желаемая:

На втором или третьем выводе должен быть также «Текст пользовательского класса»

1 Ответ

2 голосов
/ 25 апреля 2019

что во всех случаях выполняется перегрузка оператора пользовательских классов << и что во всех случаях я получаю результат os << customClass вместо адресов указателей в случае классов указателей </p>

Вот как я бы это сделал:

#include <iostream>
#include <string>
#include <memory>

class MyClass {
    std::string s;

    friend std::ostream& operator<<(std::ostream& os, const MyClass& c) {
        os << c.s;
        return os;
    }

public:
    MyClass(const std::string& s_) : s(s_) {}
};

template<typename T>
std::ostream& operator<<(std::ostream& os, const std::shared_ptr<T>& pc) {
    os << pc.get() << " " << *pc;
    return os;
}    


int main() {
    std::shared_ptr<MyClass> pc = std::make_shared<MyClass>("Hello");
    std::cout << pc << std::endl;
}

Вывод

0x20f5c30 Hello

См. живой пример .

...