重载流<<指针/共享指针和其他类型的运算符

时间:2019-04-25 07:21:14

标签: c++ stream operator-overloading

是否可以通过以下所有方式重载自定义类的<<操作符:

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

os << customClass;
os << sharedPointer;

或者至少以下工作有效:

os << sharedPointer.get();

默认情况下,使用通用技术使operator重载,只有以下两个选项有效:

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 个答案:

答案 0 :(得分:2)

  

在所有情况下都将执行自定义类<<运算符重载,并且在所有情况下都将得到os << customClass的结果,而不是在指针类的情况下得到指针地址

这是我要怎么做:

$data = [
  0 => 'title',
  1 => 'featured',
  2 => 'content',
  3 => 'category_id',
  4 => 'slug'
];
$columns = "'".implode("','",$data)."'";
$res = Component::select(DB::raw("CONCAT($columns) AS Alias"))->get();

输出

#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;
}

查看live example