gpt4 book ai didi

c++ - 正确重载 stringbuf 以替换 MATLAB mex 文件中的 cout

转载 作者:可可西里 更新时间:2023-11-01 17:11:12 25 4
gpt4 key购买 nike

MathWorks 目前不允许您在 MATLAB 桌面打开时使用 mex 文件中的 cout,因为它们已重定向标准输出。他们当前的解决方法是提供一个函数,mexPrintf, that they request you use instead .在谷歌搜索了一下之后,我认为可以扩展 std::stringbuf 类来完成我需要的事情。这是我到目前为止所拥有的。这是否足够健壮,或者是否有其他方法需要重载或更好的方法来做到这一点? (寻找通用 UNIX 环境中的可移植性以及如果此代码未链接到 mex 可执行文件,则能够正常使用 std::cout)

class mstream : public stringbuf {
public:
virtual streamsize xsputn(const char *s, std::streamsize n)
{
mexPrintf("*s",s,n);
return basic_streambuf<char, std::char_traits<char>>::xsputn(s,n);
}
};

mstream mout;
outbuf = cout.rdbuf(mout.rdbuf());

最佳答案

你不是真的想重载std::stringbuf,你想重载std::streambufstd::basic_streambuf (如果你想支持多种字符类型),你也需要重写overflow方法。

但我也认为您需要重新考虑您的问题解决方案。

cout 只是一个 ostream,所以如果所有类/函数都采用 ostream,那么您可以传入任何您喜欢的内容。例如cout, ofstream

如果这太难了那么我会创建我自己的 cout 版本,可能称为 mycout 可以在编译时或运行时定义(取决于你想做)。

一个简单的解决方案可能是:

#include <streambuf>
#include <ostream>

class mystream : public std::streambuf
{
public:
mystream() {}

protected:
virtual int_type overflow(int_type c)
{
if(c != EOF)
{
char z = c;
mexPrintf("%c",c);
return EOF;
}
return c;
}

virtual std::streamsize xsputn(const char* s, std::streamsize num)
{
mexPrintf("*s",s,n);
return num;
}
};

class myostream : public std::ostream
{
protected:
mystream buf;

public:
myostream() : std::ostream(&buf) {}
};

myostream mycout;

cout 版本可以是:

typedef std::cout mycout;

运行时版本需要更多工作,但很容易实现。

关于c++ - 正确重载 stringbuf 以替换 MATLAB mex 文件中的 cout,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/243696/

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