登录论坛

查看完整版本 : 正确重载stringbuf以替换MATLAB mex文件中的cout


poster
2019-12-07, 23:17
当MATLAB桌面打开时,MathWorks当前不允许您从mex文件使用cout ,因为它们已经重定向了stdout。他们当前的解决方法是提供功能mexPrintf,要求他们改用 (http://www.mathworks.com/support/tech-notes/1600/1605.html) 。仔细研究一下之后,我认为可以扩展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::xsputn(s,n); } }; mstream mout; outbuf = cout.rdbuf(mout.rdbuf()); 回答:
您并不是真的想重载std::stringbuf ,而是想重载std::streambuf或std::basic_streambuf (如果您想支持多种字符类型),那么您还需要重写overflow方法。

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

cout只是一个ostream ,因此,如果所有类/函数都使用一个ostream那么您可以传递任何您喜欢的东西。例如cout , ofstream等

如果这太难了,那么我将创建自己的cout版本(可能称为mycout ,可以在编译时或运行时定义它(取决于您要执行的操作)。

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

#include #include 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; 提示版本可能只是:

typedef std::cout mycout; 运行时版本需要更多工作,但容易实现。