2011-08-24 17 views
0

我有一個簡單的結構,其中包含我正在處理的應用程序中的GUI控件。 的結構被定義像容器templateStruct <T>變化T

template<class T> 
struct guiControl 
{ 
    T minValue 
    T defaultValue 
    ... 
} 

每個控制是通過在我的應用程序的唯一整數ID標識。我想用map<int, guiControl>訪問結構,但這是不允許的:

非特類模板不能作爲模板參數模板參數... 使用類模板需要模板參數列表

好的,這對我來說很有意義 - 編譯器需要確切知道地圖的值類型需要多少空間。但是有沒有其他辦法可以逼近我的這種行爲 - 最好不要進入Boost或更復雜的階級層面?

+8

從一個公共基類派生所有控件是否可行? –

+2

如果你可以使用一個共同的基類沒有模板,也許你可以使用地圖> – winterTTr

+0

也許http://stackoverflow.com/questions/7154602/hold-any-kind-的答案之一of-c-template-class-in-member-variable有幫助嗎? – PlasmaHH

回答

0

這是沒有意義的訪問你的控件在一張地圖,因爲它們是不同的類型是什麼意思,你不能對他們進行等相同的方法......

你可以做的是定義一個通用類包含每一個控制應具有,然後將元件從該類得到特殊控制:

template<class T> 
class guiControl 
{ 
    T minValue; 
    T defaultValue; 
    /* ... */ 
} 

示例控制:

class Button : public guiControl<int> 
{ 
    /* ... */ 
    int get_id() { return id; } 
} 

,那麼你仍然可以使地圖的id和指針到你的對象,當你投的對象指針的基類的類型:

map<int, guiControl<int>* > controls; 
Button button; 
controls[button.get_id()] = dynamic_cast<guiContorl<int>*>(&button); 

現在,您可以訪問guiControl成員(如minValue )通過id控制你的控件,甚至將它們轉換回它們的派生類型,但是你將不得不知道它們是哪種類型。

相關問題