首页 > 解决方案 > 与 std::cout 一样将参数传递给成员函数

问题描述

我想创建一个具有可用作 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直接使用一样。那可能吗?我在网上搜索并阅读了很多,但没有得到它的工作,任何人都可以帮助或链接一个页面以获取更多信息?

标签: c++

解决方案


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在您的情况下,可以将数据“流式传输”到 a :

  • 直截了当,不像你的问题,而是像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;
    }
    

这段代码有点“草图”,但它确实有效


推荐阅读