2010-08-21 227 views
1

我在我的應用程序中有一個生產者/消費者設計,它在用戶類型上實現生產者/消費者功能。但對於標準庫,特別是對於算法而言,它並不是很自然。C++和枚舉

在C#中有Enumerable和Observable概念,可以用來輕鬆實現像這樣的東西,並獲得很多不錯的免費功能。

在C++中有我認爲可能有用的ios,istream,ostream,input_iterator,output_iterator概念。但在我看來,所有這些都是針對原始字符類型的,例如char,int等...而不是用戶類型。

當然,我可以使用真正的功能,如產品/消費者和std :: mem_fn算法。但我希望有更好的辦法。

我正在尋找一些關於如何去設計I/O類似C++用戶類型的解決方案的最佳實踐建議。

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。

想法?

+0

你爲什麼在談論C#?這是C++,忘記了解C#並開始用C++編程。說「我會用X語言這樣做,我怎麼能把它翻譯成Y語言」總是會失敗,你必須從頭開始學習Y語言,這樣你才能知道Y語言是如何完成的。[一本好書幫助(http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list)。哦,我不明白這個問題。當你把語言X帶入關於Y語言的問題時,很多懂Y語言的人需要你解釋X語言特性。 – GManNickG 2010-08-21 20:22:53

+0

您能否更好地解釋「用戶類型的產品/消費函數」的含義? – Dacav 2010-08-21 20:24:34

+0

無論我說什麼語言,都不重要。我只是選擇了C#,因爲它具有與C++及其迭代器和算法類似的LINQ概念,因此很方便。 我的問題是爲什麼C + + ios概念不允許用戶類型和有什麼替代方案。 – ronag 2010-08-21 20:26:29

回答

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

或者一個類似於它。 (對不起,我對這個問題的理解很少。)想要這個接口有點奇怪,因爲它與流無關,而且你可能更適合使用不同的接口(顯式方法)。

+0

不完全一樣,你展示的是如何將用戶類型轉換爲字符串。 我一直在尋找這樣的事情(這是自STL的istream對象不起作用/ ostream的似乎是基於字符的) 類MyFrameProducer:istream的 {} 類MyFrameConsumer:ostream的 {} int main() { MyFrameProducer producer; MyFrameConsumer consumer; 框架; (!producer.eof()) { producer >> frame;消費者<<框架; } } – ronag 2010-08-21 20:42:20

+1

@ronag:我沒有*顯示如何將用戶類型轉換爲字符串,我展示瞭如何將其插入流中。 (只有巧合的'stringstream'提供了一種生成字符串的方法。)讓我編輯您的評論片段的答案。 – GManNickG 2010-08-21 20:45:45

+0

我修正了一些問題,但現在它是社區wiki,對不起。 – Philipp 2010-08-21 21:14:59

2

看看this生產者/消費者解決方案。雖然它是純粹的C它是如此優雅,所以我無法拒絕發佈它。

+1

有趣的是,這似乎也很有趣:http://www.crystalclearsoftware.com/soc/coroutine/ – ronag 2010-08-21 20:43:30