将使用字符串作为参数调用函数的自定义 ostream

custom ostream that will call the function with string as argument

我来自 ActionScript,所以我不太喜欢 C++。但是我认为这是可以实现的,但我不知道如何实现。

我正在使用一个库,您在其中将 ostream 声明为标准输出。现在,在所有示例中,ostream 都设置为 cout,但我想自己处理字符串。

我在徘徊,如果有可能一旦图书馆做到了ostream << "string" 我得到类似

的东西
function handleString (string output){
// handle output
}

这样我就可以在这里处理了。


如何设置 ostream 以字符串作为参数调用函数?


lib 中的示例。

在header我有

class Lib {
ostream* m_Output; // The output stream

...

public:
    inline void SetOutputStream(ostream* o){ m_Output = o; m_Output->precision(2); *m_Output << fixed; }

实施示例

*m_Output << "Some string output" << endl;

使用库的示例 CLI 应用示例,它如何设置输出流

Validator->SetOutputStream(&cout); // Set output to std::cout

我想做这样的事情

Validator->SetOutputStream(ostreamObjectThatWillCallMyFunctionAsString);

如果我没看错,您可能想要重载 << 运算符。 这应该有效:

class Lib
{
    std::ostream *m_Output;

    friend std::ostream& operator<<(const Lib &, const std::string &);
};

std::ostream& operator<<(const Lib &lib, const std::string &s)
{
    if(lib.m_Output)
    {
        lib.m_Output->write(s.c_str(), s.length());
    }

    return *lib.m_Output;
}

从描述来看,您似乎只想构建一个字符串并对其进行处理。您可以使用字符串流来做到这一点:

#include <iostream>
#include <sstream>
void f(std::ostream& out) { out << "f()"; }
int main() {
    std::ostringstream out;
    f(out);
    std::cout << "string='" << out.str() << "'\n";
    f(std::cout);
}

如果您想在流发生某些事件时自动调用一个函数,例如,当它被刷新时,您可以使用自定义流缓冲区并用它创建一个 std::ostream。我只会在刷新或换行时调用该函数。否则,您要么接到每个角色的电话,要么出现某种不可预知的行为。这是一个简单的例子:

class funbuf:
    public std::streambuf {
    std::string buffer;
    std::function<void(std::string const&)> fun;
public:
    funbuf(std::function<void(std::string const&)> fun)
        : fun(fun) {}
    int overflow(int c) {
        if (c != std::char_traits<char>::eof()) {
            buffer.push_back(c);
             // this->fun(this->buffer); // for each char
        }
        return std::char_traits<char>::not_eof(c);
    }
    int sync() {
        this->fun(this->buffer);
        return 0;
    }
};
void process(std::string const& s) {
    std::cout << "process(" << s << ")\n";
}
int main() {
    funbuf sbuf(&process);
    std::ostream out(&sbuf);
    out << "one " << 1 << "\n" << std::flush;
    out << std::unitbuf << "three " << 3 << '\n';
}

因此应该是一个有效的例子(它未经测试并且是在 phone 上打字的,即可能有很多错别字)。该演示显示使用 std::unitbuf 显式和隐式地刷新流。一种变体可能是在调用函数后重置缓冲区,这很容易通过添加

来实现
this->buffer.clear();

在战略要地。同样,可以轻松避免在字符串为空时调用函数。