C ++和Enumerable

时间:2010-08-21 20:18:09

标签: c++

我的应用程序中有一个生产者/消费者设计,它在用户类型上实现Produce / Consume功能。但它对标准库,尤其是算法无效。

在C#中有Enumerable和Observable概念,可以用来轻松实现这样的东西,并获得很多不错的免费功能。

在C ++中,我认为ios,istream,ostream,input_iterator,output_iterator概念可能很有用。但在我看来,所有这些都适用于原始字符类型,例如char,int等...而不是用户类型。

当然,我可以使用诸如Produce / Consumer和std :: mem_fn之类的实际函数来实现算法。但我希望有更好的方法。

我正在寻找关于如何在C ++中为用户类型设计i / o类似解决方案的最佳实践建议。

E.g。来自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。

思想?

2 个答案:

答案 0 :(得分:3)

术语是“插入运算符”和“提取运算符”,它从流中插入和提取数据。

以下是一个例子:

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

或类似的东西。 (抱歉,我对这个问题的理解很小。) 希望这个接口有点奇怪,因为它与流无关,你可能会用不同的接口做得更好(显式方法) )。

答案 1 :(得分:2)

查看this生产者/消费者解决方案。虽然它是纯粹的C,它是如此优雅,所以我无法抗拒发布它。