<T> 具有不同 T 的模板结构的容器

Container of templateStruct<T> with varying T

本文关键字:结构 lt gt      更新时间:2023-10-16

我有一个简单的结构体,其中包含我正在开发的应用程序中的GUI控件。结构体的定义如下

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

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

非特化类模板不能用作模板形参的模板实参…使用类模板需要模板实参列表

好的,这对我来说是有意义的——编译器需要确切地知道映射的值类型需要多少空间。但是,是否有其他方法可以近似这种行为-最好不使用Boost或更复杂的类层次结构?

在一个地图中访问控件是没有意义的,因为它们是不同类型的,这意味着你不能对它们执行相同的方法等等…

你能做的就是定义一个通用类,其中包含每个控件应该具有的元素,然后从该类派生特殊控件:

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