在重载operator<<时,将C++流作为参数。

31 浏览
0 Comments

在重载operator<<时,将C++流作为参数。

我正在尝试编写自己的日志记录类并将其用作流:\n

logger L;
L << "whatever" << std::endl;

\n这是我开始的代码:\n

#include 
using 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<<的第一个参数会发生变化,有时是指针的引用,有时看起来像是双重引用...

0
0 Comments

这个问题的出现是因为流对象没有重载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<<时遇到的问题。

0
0 Comments

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等。通过编写匹配函数签名的函数,并在其中执行所需的操作,可以实现自定义操作符的功能。

0
0 Comments

问题的原因是endl是一个函数而不是常量值,所以需要特殊的重载来处理endl的应用。解决方法是提供一个特殊的operator<<重载,其第二个参数与endl的特定实例匹配。这样可以解决调用的冲突。对于为什么编译器不能自动推断T为函数指针并绑定到它的问题,原因是endl实际上是一个模板函数,可以接受任何类型的ostream作为输入和输出。因此,编译器无法确定要传递的是哪个endl。提供特殊重载可以解决这个问题。

0