gpt4 book ai didi

c++ - 为 cout 做一个包装器?

转载 作者:搜寻专家 更新时间:2023-10-31 00:38:19 25 4
gpt4 key购买 nike

所以这是一个有趣的问题,我如何制作类似于 cout 包装器的东西?我希望能够将它添加到一个 dll 中,这样我就可以将它放入我的程序中。但它的基本语法应该是

    Mything::mesage << "I'm some text" << im_an_int << someclass << mything::endl;

    Mything::mesageandlog << "I'm going to print to console, and to a file!" << mything::endl;

我可以处理大部分内部逻辑,但至于我应该做什么才能做到这一点。有点难过。

可能在我的类中创建一个名为 message 的静态流成员,然后在它也被写入时触发一个事件,通过一个方法运行它?

Idk,我环顾四周,发现了一些类似的东西,但至于把它扔进一个 dll 中,我不知所措。 ( How to write a function wrapper for cout that allows for expressive syntax? )因为这需要我使用 extern 和一个变量,但我如何将它设为静态以便我可以直接调用它而不创建变量?

澄清一点,像这样:mydll.h

#include <iostream>
namespace mynamespace {

extern struct LogMessage{};

template <typename T>
LogMessage& operator<< (LogMessage &s, const T &x) {
SetStdHandle(STD_OUTPUT_HANDLE, GetStdHandle(STD_OUTPUT_HANDLE));
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_BLUE);
std::cout << "[IF] ";
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_WHITE);
//LogTimestamp(); --ill impliment this.
std::cout << x << endl;
//writeStreamToLogfile(s); --and ill handle this.
return s;
}
}

驱动程序.h

#include <mydll.h>
#include <iostream>
int _tmain(int argc, _TCHAR* argv[])
{
mynamespace::LogMessage << "Something: << std::endl;
}

预期输出:

"[IF] [00:00:00] Something

最佳答案

你可以创建一个结构,它有一个 << 运算符

struct OutputThing
{

template< class T >
OutputThing &operator<<( T val )
{
std::cout<<val;
return *this;
}
};

现在无论何时你想记录,你都必须实例化对象。

OutputThing()<<"x ="<<x;

如果要避免对象的重复构造和销毁,可以将其做成单例。

struct OutputThingSingleton
{
static OutputThingSingleton& GetThing()
{
static OutputThingSingleton OutputThing;
return OutputThing;
}

template< class T >
OutputThingSingleton &operator<<( T val )
{
std::cout<<val;
return *this;
}

private:
OutputThingSingleton()
{};

};

所以调用现在看起来像

OutputThingSingleton::GetThing()<<"x ="<<x;

您可以使用宏来缩短。

这将适用于多个 dll,但是根据它的使用方式,您可以拥有多个现有的单例实例。只要您不想在单例中保持任何状态,这就可以正常工作。如果确实需要保证单例,可以编译成自己的dll。使用此 dll 的任何其他二进制文件将共享该 dll“拥有”的单个实例。

关于c++ - 为 cout 做一个包装器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18326862/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com