派生类的部分类模板特化

时间:2013-03-18 00:34:31

标签: c++ template-specialization

我正在尝试编写一个程序,在LCD上为嵌入式Linux系统绘制用户界面元素。我有一个名为Widget的基类,它实现了绘图和擦除等基本功能,并具有x / y位置和宽度/高度等属性。然后我派生了类LabelButtonProgressBar,它们分别添加了自己的属性(文本,焦点和值)。

我的问题是我想创建一个名为WidgetArray的模板容器类,它将自动生成一个小部件网格,并编辑它们的属性。但是,如果WidgetArray包含一个带有字符串向量并将每个字符串分配给text的{​​{1}}属性的函数,如果我声明{{1}的实例包含Label s(没有文本属性),编译器抱怨。这似乎是模板专业化的完美案例。我正在cplusplus.com阅读有关模板专业化的页面,并看到了这一点:

  

当我们为模板类声明特化时,我们还必须定义它的所有成员,甚至是那些与通用模板类完全相同的成员,因为没有从通用模板到专门化的成员的“继承”。

请告诉我有办法解决这个问题。 WidgetArray的绝大多数成员函数对于ProgressBar的所有派生类都是完全有效的,而且我必须复制并粘贴整个代码以使{WidgetArray非常愚蠢。 {1}}只是为派生类添加一个专用函数。

这是我的代码的简化版本:

Widget

我希望我的问题很明确。我环顾四周,有关于模板专业化的帖子很多,但我找不到一个似乎回答我问题的帖子。

1 个答案:

答案 0 :(得分:2)

听起来你想要的只是一个模板化的基类,它包含所有特定于两者的方法,然后从中继承。例如:

template <typename T>
struct base
{
protected:
    std::vector<T> children;
    ~base() { }

public:
    void draw_children();
    //Other methods common to all template parameters T

};


class WidgetArrayString
    : public base<std::string>
{
    //Methods specific only to strings
};

class WidgetArrayProgressBar
    : public base<ProgressBar>
{
    //Methods specific only to progress bar
};