MathWorks 目前不允许您使用cout
当 MATLAB 桌面打开时,从 mex 文件中读取,因为它们已重定向 stdout。他们当前的解决方法是提供一个函数,mexPrintf,他们要求你改用 http://www.mathworks.com/support/tech-notes/1600/1605.html。经过一番谷歌搜索后,我认为可以扩展std::stringbuf
类来做我需要做的事情。这是我到目前为止所拥有的。这是否足够强大,或者是否有其他我需要重载的方法或更好的方法来做到这一点? (寻求通用 UNIX 环境中的可移植性以及使用的能力std::cout
如果此代码未链接到 mex 可执行文件,则正常)
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::streambuf
or std::basic_streambuf
(如果你想支持多种字符类型),你还需要重写溢出方法。
但我也认为你需要重新考虑你的问题的解决方案。
cout
只是一个ostream
,所以如果所有类/函数都采用ostream
然后你可以传递任何你喜欢的东西。例如cout
, ofstream
, etc
如果这太难了,那么我会创建我自己的版本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;
运行时版本需要更多工作,但很容易实现。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)