2015-01-16 42 views
0

我来自ActionScript,所以我不那么热衷于C++。但我认为这可以实现,但我不知道如何。自定义ostream,将调用函数与字符串作为参数

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

我是游荡,如果有可能,一旦库做ostream << "string" ,我得到这样的

function handleString (string output){ 
// handle output 
} 

,这样我可以在这里处理。


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


来自lib的示例。

在头我有

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

...实施例使用的lib,它是如何设置输出例如CLI应用的

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

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

实施例流

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

我想要做这样的

Validator->SetOutputStream(ostreamObjectThatWillCallMyFunctionAsString); 
+0

您遇到了什么问题?在问题中明确提到问题。 – doptimusprime

+0

做了它,更清楚地添加了 – Tree

回答

0

从看来你只是想建立一个字符串,这个过程的描述。你可以这样做,使用字符串流:

#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'; 
} 

因此应该是一个工作示例(这是未经测试,输入一个电话,即可能与错别字百出)。演示显示使用std::unitbuf明确和隐含地清除流。可以通过添加容易实现的功能来重置缓冲区,其中一种可能是重置缓冲区

this->buffer.clear(); 

在一个战略点。同样,如果字符串为空,则可以避免调用该函数。

+0

但是每次Lib产生一个输出流时,这都不会调用'f'。或者我错了? – Tree

+0

正确。如果你想在每次输出时调用一个函数,你可以创建一个流缓冲区并覆盖'overflow()'和'sync()'方法。 –

+0

这是我想要的方法,但我没有这么好的C++,所以我需要一些时间来实现它在我的情况:)但是这回答了我的问题,而streamBuffer就是我一直在寻找 – Tree

0

东西,如果我得到你的权利,你可能想超载< <操作。 这应该工作:

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; 
} 
+0

可能,我会尝试:) – Tree

+0

这将崩溃,因为你在“operator <<”里面调用“operator <<”,这是一个无限递归。 – Windoze

+0

是的显然是我的不好,将编辑 – Axalo

相关问题