像std :: cout一样将参数传递给成员函数

时间:2018-05-29 14:59:30

标签: c++

我想创建一个带有成员函数的类,可以用作std :: cout。为了演示这个问题,我创建了这个代码示例

#include <iostream>
#include <string>

class myClass
{
public:
    void myFunc(? data)
    {
        std::cout << data << std::endl;
    }
};

int main()
{
    myClass myObject;
    int var = 1;
    myObject.myFunc() << "Text" << var;
}

正如您所看到的,我想将参数传递给函数,就好像我会直接使用std::cout一样。那可能吗?我在网上搜索并阅读了很多内容,但没有让它工作,任何人都可以帮助或链接一个包含更多信息的页面吗?

2 个答案:

答案 0 :(得分:3)

您无法调用myObject.myFunc()并让它传递这些参数。如果你把它称为(),那么它没有参数。

要使用x << y之类的iostream语法,您需要myFunc()返回重载operator<<的内容,以便myFunc() << "Text"能够正常工作。显而易见的答案是只返回对std::cout本身的引用:

class myClass
{
public:
    std::ostream& myFunc()
    {
        return std::cout;
    }
};

但它可以是对std::ostream类派生的不同对象的引用,因此支持operator<<,例如对std::ofstream的引用会写入文件而不是标准输出:

class myClass
{
    std::ofstream m_outputFile{ "output.txt" };
public:
    std::ostream& myFunc()
    {
        return m_outputFile;
    }
};

答案 1 :(得分:3)

std::cout“通过使用二元运算符”operator<<(也称为流运算符或左移运算符)来获取输入。它可以是一个类的方法,例如:

class A {
public:
    template <typename T>
    A& operator<<(const T& x) {
        // do stuff with x
        return *this;
    }
}

或独立的二元函数:

class A { ... };
template <typename T>
A& operator<<(A& lhs, const T& rhs) {
    // do stuff with A and rhs
    return lhs;
}

在您的情况下,可以将“流式传输”数据传输到myClass

  • 直接,不像你的问题,但与std::cout一样:

    class myClass {
    public:
        template <typename T> void myFunc(const T& data) { ... }
    }
    
    template <typename T>
    myClass& operator<<(myClass& lhs, const T& rhs) {
        lhs.myFunc(rhs);
        return lhs;
    }
    
  • 使用myFunc()返回的代理对象:

    class myClass {
    public:
         struct StreamingProxy { A const & ref; }
         StreamingProxy myFunc() { return StreamingProxy{*this}; }
    }
    
    template <typename T>
    myClass::StreamingProxy operator<<(myClass::StreamingProxy lhs, const T& rhs) {
        lhs.ref.myFunc(data);
        return lhs;
    }
    

这段代码有点像“草图”,但确实是work

相关问题