代码之家  ›  专栏  ›  技术社区  ›  ronag

C++与枚举

c++
  •  1
  • ronag  · 技术社区  · 15 年前

    我的应用程序中有一个生产者/消费者设计,它在用户类型上实现生产者/消费者功能。但在标准库中,尤其是在算法中,它并不能很自然地工作。

    在C中,有一些可枚举和可观察的概念,可以用来轻松地实现类似的东西,并获得大量优秀的免费功能。

    在C++中有iOS、istrAM、oSover、输入-迭代器、输出迭代器概念,我认为这些概念可能有用。但在我看来,所有这些都是针对原始字符类型的,例如char、int等。不适用于用户类型。

    当然,我可以使用实际的函数,例如product/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
    {...}
    

    也许我在想办法,应该亲一下。

    思想?

    2 回复  |  直到 15 年前
        1
  •  3
  •   GManNickG    15 年前

    术语是“插入运算符”和“提取运算符”,用于插入和提取流中的数据。

    下面是一个例子:

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

    或者类似的东西。(对不起,我对这个问题的理解很小。)它 想要这个接口有点奇怪,因为它与流无关,您最好使用不同的接口(显式方法)。

        2
  •  2
  •   Ihor Kaharlichenko    15 年前

    看一看 this 生产商/消费者解决方案。虽然它是纯C的,但它非常优雅,所以我忍不住把它贴出来。