【问题标题】:Container of templateStruct<T> with varying T具有不同 T 的 templateStruct<T> 的容器
【发布时间】:2011-08-24 14:44:54
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 从一个公共基类派生所有控件是否可行?
  • 如果你可以使用没有模板的通用基类,也许你可以使用 map >
  • 也许stackoverflow.com/questions/7154602/… 的答案之一有帮助?
  • 一个唯一的整数 ID。说,也许你的意思是像一个指针
  • 真的有必要把这个类做成模板吗?只需使用long longdouble 即可。

标签: c++ templates types containers


【解决方案1】:

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

您可以做的是定义一个包含每个控件应具有的元素的通用类,然后从该类派生特殊控件:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-12
    • 1970-01-01
    • 1970-01-01
    • 2020-09-14
    • 2018-07-15
    • 1970-01-01
    相关资源
    最近更新 更多