运算符<<在用户定义的方法中

时间:2015-06-25 08:52:41

标签: c++ operators

我试图编写一个方法,使用>>运算符作为参数simmilar到std::cin,但我不知道怎么做。是否有可能创建这种方法,将此流作为参数,正确转换(例如将所有的int转换为字符串等),然后保存到std :: string变量?我真的会帮助所有人,也许是一些基本的例子?

以下是我希望如何运行该功能的示例:

int i = 0;
myMethod << "some text" << i << "moar text";

在该方法中,我想将这些参数存储在一个字符串中。

编辑:我将尝试解释这个应用程序的内容:我正在尝试创建一个Clogger sigleton类,用于将日志保存到文件中。通过这种结构,我可以从代码中的任何位置调用*CLogger::instance() << "log stuff";,这没关系。感谢这个主题的答案,我已经到了这里。问题是我使用的每个operator<<,然后将调用该对象。所以如果我做* CLogger :: instance()&lt;&lt; &#34;记录东西&#34; &LT;&LT; &#34;更多东西&#34; &LT;&LT; &#34;甚至更多&#34 ;;`这个方法(?)将被调用3次:

template<typename T>
    CLogger& operator<<(const T& t)
    {
        ...

        return *this;
    }

这对我不好,因为我打算在每个日志行之前和之后添加一些文本。例如,我总是想在之前和std::endl之后添加时间。按照我给出的例子,而不是得到:

[00:00] log stuff more stuff even more

我会得到:

[00:00] log stuff 
[00:00]  more stuff 
[00:00]  even more

所以我尝试通过改变这样的方法来消除这种行为:

template<typename T>
    CLogger& operator<<(const T& t)
    {
        ostringstream stream;
        stream << t;
        m_catString += stream.str();

        if (stream.str() == "\n")
        {
            push_back(m_catString);
            m_catString.clear();
        }

        return *this;
    }

这样,如果我在末尾添加"\n",程序就会知道何时推送新的日志行。它几乎没问题,因为我打赌我会忘记添加它。还有更聪明的方法吗?

2 个答案:

答案 0 :(得分:1)

我知道的唯一方法是创建一个类class Method,然后重载operator<<operators overloading

template<class T>
Method &operator<<(const T &x)
{
    // Do whatever you like
    return *this;
}

然后你就可以使用它:

Method myMethod;
myMethod << ... ;

您可以查看this question关于创建类似cout的类 顺便说一下,std :: cin和std :: cout不是函数

修改

class CLogger
{
  ...

  template<typename T>
  CLogger& operator<<(const T& t)
  {
     push_back(std::to_string(t));
     return *this;
  }


};

您不必创建类Pusher,只需在第一个类中重载运算符,现在可以将它与对象一起使用:

myCLogger << t; // this would call the function push back

答案 1 :(得分:1)

您无法使用<<将参数传递给方法,您需要一个对象。

这样的事情:

struct A
{
    template<typename T>
    A& operator<<(const T& t)
    {
        std::ostringstream stream;
        stream << t;
        data += stream.str();
        return *this;
    }
    std::string data;
};

// ...

A a;
a << "Hello " << 34 << " World";
std::cout << a.data;

关于您的更新:

最明显的是在CLogger中实现运算符,而不是Pusher类;这会让你写*CLogger::instance() << "sample text" << 10;

如果由于某种原因你无法做到这一点(你很难分辨出信息,所以很难说出来),你可以声明Pusher朋友并使用与其他地方相同的方法:

struct Pusher
{
    template<typename T>
    Pusher& operator<<(const T& t)
    {
        std::ostringstream stream;
        stream << t;
        CLogger::instance()->push_back(stream.str());
        return *this;
    }

};