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

2024-04-29

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(使用前将#替换为@)

正确重载 stringbuf 以替换 MATLAB mex 文件中的 cout 的相关文章

随机推荐