我试图编写一个方法,使用>>
运算符作为参数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"
,程序就会知道何时推送新的日志行。它几乎没问题,因为我打赌我会忘记添加它。还有更聪明的方法吗?
答案 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;
}
};