在重载operator<<时,将C++流作为参数。
在重载operator<<时,将C++流作为参数。
我正在尝试编写自己的日志记录类并将其用作流:\n
logger L; L << "whatever" << std::endl;
\n这是我开始的代码:\n
#includeusing namespace std; class logger{ public: template friend logger& operator <<(logger& log, const T& value); }; template logger& operator <<(logger& log, T const & value) { // 在这里,我将值输出到文件和标准输出等 cout << value; return log; } int main(int argc, char *argv[]) { logger L; L << "hello" << '\n' ; // 这个可以工作 L << "bye" << "alo" << endl; // 这个不工作 return 0; }
\n但是当尝试编译时,我遇到了一个错误,说在使用std::endl时没有定义operator<<:\n[apcode language="cpp"]
pruebaLog.cpp:31: error: no match for ‘operator<<’ in ‘operator<< [with T = char [4]](((logger&)((logger*)operator<< [with T = char [4]](((logger&)(& L)), ((const char (&)[4])"bye")))), ((const char (&)[4])"alo")) << std::endl’
[/apcode]\n所以,我一直在尝试重载operator<<以接受这种类型的流,但是这让我疯了。我不知道该怎么做。例如,我查看了ostream头文件中std::endl的定义,并编写了一个具有此头的函数:\n[apcode language="cpp"]
logger& operator <<(logger& log, const basic_ostream>& (*s)(basic_ostream >&))
[/apcode]\n但是没有成功。我尝试使用模板而不是直接使用char,还尝试简单地使用\"const ostream& os\",但都没有成功。\n还有一件困扰我的事情是,在错误输出中,operator<<的第一个参数会发生变化,有时是指针的引用,有时看起来像是双重引用...
这个问题的出现是因为流对象没有重载operator<<来接受一个与std::endl具有相同类型的函数。可以通过以下方法解决这个问题:
1. 重载operator<<来接受与std::endl具有相同类型的函数作为参数。
std::ostream& operator<<(std::ostream& os, std::ostream& (*func)(std::ostream&)) { // 实现操作 return os; }
2. 将std::endl替换为一个自定义的函数,并将该函数与流对象的operator<<一起重载。
std::ostream& myEndl(std::ostream& os) { // 实现操作 return os; } class MyClass { public: friend std::ostream& operator<<(std::ostream& os, const MyClass& obj) { // 实现操作 return os; } friend std::ostream& operator<<(std::ostream& os, std::ostream& (*func)(std::ostream&)) { // 实现操作 return os; } };
通过以上两种方法,可以解决C++流作为参数重载operator<<时遇到的问题。
C++中的流(stream)是一种可以通过重载运算符<<来实现自定义操作的类。在C++中,endl是一个IO操作符,它是一个接受一个流的函数对象(functor),在流上执行一些操作,并返回该流的引用。cout << endl等价于cout << '\n' << flush,其中flush是一个刷新输出缓冲区的操作符。
在自定义的类中,可以通过重载运算符<<来实现对endl的操作:
logger& operator<<(logger& (*function)(logger&)) {
return function(*this);
}
其中logger&(*)(logger&)是接受并返回logger的函数的类型。为了自定义操作符,只需要编写一个匹配该函数签名的函数,并在其中执行一些操作:
logger& newline(logger& L) {
return L << '\n';
}
这种方法比通常的方法更复杂,但是也是一种有趣的方式。
,C++中的流(stream)可以通过重载运算符<<来实现自定义操作。在重载运算符<<时,可以将流作为参数传递,并在其中执行一些操作。这种方法可以用于自定义一些操作符,包括endl等。通过编写匹配函数签名的函数,并在其中执行所需的操作,可以实现自定义操作符的功能。