具有不同T </t>的templateStruct <t>的容器

时间:2011-08-24 14:44:55

标签: c++ templates types containers

我有一个简单的结构,它包含我正在处理的应用程序中的GUI控件。 结构定义为

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

每个控件都由我的应用中的唯一整数ID标识。我想使用map<int, guiControl>访问结构,但这是不允许的:

非专业化的类模板不能用作模板参数的模板参数... 使用类模板需要模板参数列表

好的,这对我来说很有意义 - 编译器需要确切地知道地图的值类型需要多少空间。但有没有其他方法可以让我近似这种行为 - 最好不要进入Boost或更复杂的类heirarchy?

1 个答案:

答案 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),甚至将它们转换回派生类型,但是您必须知道它们是哪种类型。