我有一个简单的结构,它包含我正在处理的应用程序中的GUI控件。 结构定义为
template<class T>
struct guiControl
{
T minValue
T defaultValue
...
}
每个控件都由我的应用中的唯一整数ID标识。我想使用map<int, guiControl>
访问结构,但这是不允许的:
非专业化的类模板不能用作模板参数的模板参数... 使用类模板需要模板参数列表。
好的,这对我来说很有意义 - 编译器需要确切地知道地图的值类型需要多少空间。但有没有其他方法可以让我近似这种行为 - 最好不要进入Boost或更复杂的类heirarchy?
答案 0 :(得分: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);
现在,您可以通过ID访问控件的guiControl
成员(例如minValue
),甚至将它们转换回派生类型,但是您必须知道它们是哪种类型。