捕获/重定向 cout 到函数

发布于 2024-12-02 04:05:45 字数 114 浏览 1 评论 0原文

是否可以以某种方式捕获 cout,以便每个标准输出 (cout << "example";) 自动调用函数 (myfunc("example");)?

Is it possible to capture cout in a way so that every standard output (cout << "example";) automatically calls a function (myfunc("example");)?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

葬花如无物 2024-12-09 04:05:45

一种方法是创建一个具有适当的运算符<<重载的类,并创建一个名为cout的全局实例,并使用std::whatever 而不是 using namespace std;。然后,从自定义 coutstd::cout 来回切换就足够容易了。

但这只是一种解决方案(可能需要大量的工作,超出您想要的花费),我相信其他人知道更好的方法。

One way would be to create a class which had the appropriate operator<< overloads and create a global instance called cout and to using std::whatever instead of using namespace std;. It would then be easy enough to switch back and forth from your custom cout to std::cout.

That's just one solution though (which may require a decent amount of work, more than you want to spend), I'm sure other people know better ways.

与他有关 2024-12-09 04:05:45

您需要做的是创建一个继承自 std::streambuf 的新类,并重载虚拟函数 virtual int Overflow(int c); 。然后,您需要在此类的 cout 上使用 rdbuf()

将其连接到 cout 后,每个字符输出都会调用 overflow()

例子:

#include <iostream>
#include <stdio.h>

class MyCOutClass: public std::streambuf
{
private:
    virtual int overflow(int c)
    {
        if (c == EOF)
        {
            return !EOF;
        }
        else
        {
            if(c=='\n')
                printf("\r");
            printf("%c",c);

            return c;
        }
    }
};

class MyCOutClass MyCOut;

int main(void)
{
    std::cout.rdbuf(&MyCOut);

    std::cout << "testing" << std::endl;

    return 0;
}

What you need to do is make a new class inherited from std::streambuf and overload the virtual function virtual int overflow(int c);. You then need to use rdbuf() on cout to this class.

After you connect it up to cout the overflow() will be called with every character output.

Example:

#include <iostream>
#include <stdio.h>

class MyCOutClass: public std::streambuf
{
private:
    virtual int overflow(int c)
    {
        if (c == EOF)
        {
            return !EOF;
        }
        else
        {
            if(c=='\n')
                printf("\r");
            printf("%c",c);

            return c;
        }
    }
};

class MyCOutClass MyCOut;

int main(void)
{
    std::cout.rdbuf(&MyCOut);

    std::cout << "testing" << std::endl;

    return 0;
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文