将使用字符串作为参数调用函数的自定义 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();
在战略要地。同样,可以轻松避免在字符串为空时调用函数。
我来自 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();
在战略要地。同样,可以轻松避免在字符串为空时调用函数。