我的应用程序中有一个生产者/消费者设计,可对用户类型实现生产/消费功能。但这对于标准库,尤其是算法,并不是很自然地起作用。
在C#中,有可枚举和可观察的概念,可用于轻松实现此类内容并获得许多不错的免费功能。
在C++中,我认为ios,istream,ostream,input_iterator,output_iterator概念可能有用。但在我看来,所有这些都是针对原始字符类型的,例如char,int等...,而不是用户类型。
当然,我可以使用诸如Produce / Consumer和std::mem_fn之类的真实函数进行算法处理。但是我希望有更好的方法。
我正在寻找有关如何在C++中针对用户类型设计I / O类似解决方案的一些最佳实践建议。
例如。从C#
class FrameProducer : IEnumerable<Frame> // pull frames
{...}
// Some engine between
class FrameConsumer : IObserver<Frame> // push frames
{...}
我希望在C++中有类似的东西我不相信这是可能的。
class FrameProducer : istream<Frame> // pull frames
{...}
// Some engine between
class FrameConsumer : ostream<Frame> // push frames
{...}
也许我正在努力解决这个问题,应该通过KISS来解决。
有什么想法吗?
最佳答案
术语是“插入运算符”和“提取运算符”,它们从流中插入和提取数据。
这是一个例子:
#include <iostream>
#include <sstream>
struct foo
{
int x;
};
// insertion operator
std::ostream& operator<<(std::ostream& s, const foo& f)
{
s << f.x; // insert a foo by inserting x
return s;
}
// extraction operator
std::istream& operator>>(std::istream& s, foo& f)
{
s >> f.x; // extract a foo by extracting x
return s;
}
int main(void)
{
std::stringstream ss;
foo f1 = {5};
ss << f1;
foo f2;
ss >> f2;
}
根据您的意愿:
MyFrameProducer producer;
MyFrameConsumer consumer;
Frame frame; // frame should probably be in the while loop, since its
while(!producer.eof()) // lifetime doesn't need to exist outside the loop
{
producer >> frame;
consumer << frame;
}
您可能会做出:
struct MyFrameProducer {}; // add an eof function
struct MyFrameConsumer {};
struct Frame {};
// producer produces a frame
MyFrameProducer& operator>>(MyFrameProducer& p, Frame& f)
{
/* whatever it takes to make a frame */
return p;
}
// consumer consumes a frame
MyFrameConsumer& operator<<(MyFrameConsumer& c, const Frame& f)
{
/* whatever it takes to use a frame */
return c;
}
或类似的东西。 (很抱歉,我对该问题的理解很小。)希望使用此接口(interface)有点奇怪,因为它与流无关,并且使用其他接口(interface)(显式方法)可能会更好。
关于c++ - C++和可枚举,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3538806/