2011-10-30 25 views
0

我希望能夠根據使用情況聲明一個類的類型。例如,採用3級管道,其中有3個隊列將它們連接在一起。我想確保我將各個階段與隊列連接在一起(例如:隊列朝着正確的方向,到正確的單位等等)。使用模板在C++中指定一個類型?

這是一個極其簡化的例子,試圖完成:

template<class in, class out> 
class Fifo: public queue{}; 

class Stage1; class Stage2; class Stage3; 

class Stage1{ 
    Fifo<Stage1,Stage2>* m_fifoOut; 
}; 

class Stage2{ 
    Fifo<Stage1,Stage2>* m_fifoIn; 
    Fifo<Stage2,Stage3>* m_fifoOut; 
}; 

class Stage3{ 
    Fifo<Stage2,Stage3>* m_fifoIn; 
}; 

是否有更合適的方式來實現這個功能?在編譯時最好知道隊列被錯誤地設置了。但是,我擔心使用模板會生成不必要的類副本。

+0

我不認爲'不必要的副本'在這裏真的是一個問題。相反,我會更擔心使用模板完成此操作的維護成本。這意味着如果你需要根據運行時信息構建一個管道,你將被迫做部分重寫。您可以編寫單獨的工具在執行配置之前檢查配置(例如,通過從文件讀取管道配置,而不使用模板執行排序)。 – phooji

回答

0

它看起來完全合理。我可以向你保證,在我工作的公司裏,我們經常用模板做比你想的更多的事情(你不會想知道的),並且從來沒有任何與重複的目標代碼有關的問題(我認爲是你正在考慮)。

+0

是的,我剛從大學畢業,我對使用模板比較陌生。所以我想爲我的任何新習慣養成正確的習慣;)。僅僅想要一個類型檢查就很難接受額外的開銷。 – Nickker22

+0

就你的代碼而言,在運行時內存或速度方面沒有任何開銷,因爲每個類仍然只是存儲一個指針(或兩個)。只是編譯器必須努力工作才能確定每個類的類型信息。 – Dabbler

1

我想確保我的階段,加上正確的隊列連接(例如:隊列正在朝着正確的方向前進,向右單位等。)

只要有生成第二種類型的元函數,並指定第一種類型。

template<class In> 
struct get_target; 

class Stage1; class Stage2; class Stage3; 

template<> 
struct get_target<Stage1>{ 
    typedef Stage2 type; 
}; 

template<> 
struct get_target<Stage2>{ 
    typedef Stage3 type; 
}; 

template<class In> 
class Fifo : public queue{ 
    typedef In in_type; 
    typedef typename get_target<In>::type out_type; 
}; 

struct Stage1{ 
    Fifo<Stage1> m_fifoOut; 
}; 

struct Stage2{ 
    Fifo<Stage1> m_fifoIn; 
    Fifo<Stage2> m_fifoOut; 
}; 

struct Stage1{ 
    Fifo<Stage2> m_fifoIn; 
}; 
2

我想我會嘗試更直接地表示管道。具體來說,我會盡力專注於流水線階段而不是FIFO。如果您有C++ 11可用,則可能會有一種可變模板,您可以在其中指定流水線階段的類型,並在每個流水線階段和下一階段之間自動生成一個FIFO。

+0

我希望這個在簡單的例子中可以正常工作,但它可能不會與我想要完成的事情相同,因爲有些階段可以有多個輸入/輸出。 – Nickker22

+0

@ Nickker22:在這種情況下,你構建的實際上是一個圖形,而不是一條管線。我很確定它可以繼續工作,但它無疑會更復雜一些。 –

相關問題