2014-04-06 45 views
0

我需要在結構中有一個變量結構。所以,我希望能夠將來自任何類型結構的數據包含在另一個結構中。我認爲這是可能的模板,但它不工作:在結構中使用模板

namespace BaseStructs 
{ 
    template<typedef T> 
    struct packet 
    { 
     int ID; 
     T data; 
    }; 
} 

所以,這是我,但如果我喜歡這個這個結構的對象:

BaseStructs::packet packet; 

它不起作用,因爲程序要我爲THIS結構選擇模板,但我希望「數據」變量可以更改。有關如何解決這個問題的任何想法?

我想要做的就是創建一個小對象,持有ID喜歡在我的例子,我需要從另一個對象給它(這可能會在變量和這樣的數量不同)增加額外數據。

+2

這個不清楚;如果你有一個模板,你必須用參數實例化它(例如'BaseStructs :: packet packet')。那有什麼問題? –

+0

但是,如果我這樣做。這將被應用於數據變量INSIDE數據包結構?或者它以某種方式應用於BaseStruct :: packet結構? – Dries

+0

那麼,是不是你如何使用模板? – Dries

回答

2

模板結構就是這樣 - 一個模板。如果不給它一個應該被鎖定的特定類型,就不可能初始化一個模板的實例。發生這種情況時,將從templte創建新的具體類型。

例如,代碼:

BaseStructs::packet<Foo> fooPacket; 
BaseStructs::packet<Bar> barPacket; 

會導致編譯器創建兩個新的具體類型有如下定義:

struct 
{ 
    int ID; 
    Foo data; 
}; 
struct 
{ 
    int ID; 
    Bar data; 
}; 

原始模板結構仍然存在。這些新類型都不會導致它改變其含義。

+0

哦!非常感謝你!這正是我想到的。我也會嘗試這種方法 – Dries

+0

最後一次編輯後,您的答案中的格式變得錯誤。 – Constructor

1

如果你更與C風格,你可以使用

void* data; 

比,當然,你將需要無處不在,你使用BaseStructs ::包

另一種方式來轉換爲特定類型將序列化你的結構到字符串。

或者只是存儲一個std :: map而不是你的結構。

如果你更面向對象,你應該嘗試使用多態。嘗試找到smt。在你所有的結構中都很常見。這可能是行爲。比申請的apropriate設計模式http://en.wikipedia.org/wiki/Design_pattern_(computer_science)

+0

這不是真的答案,但你無論如何幫助我。我現在可以將結構添加到該結構中,該結構是特定其他結構的子結構。(如果這是正確的說法),所以TI現在沒有BaseStruct,我可以添加從該類型結構繼承的結構 – Dries

+0

以防萬一:小心切片http://stackoverflow.com/questions/274626/what -is-the-slicing-problem-in-c – kepkin

+0

嗯有趣!感謝那! – Dries