我正在尝试编写一个程序,在LCD上为嵌入式Linux系统绘制用户界面元素。我有一个名为Widget
的基类,它实现了绘图和擦除等基本功能,并具有x / y位置和宽度/高度等属性。然后我派生了类Label
,Button
和ProgressBar
,它们分别添加了自己的属性(文本,焦点和值)。
我的问题是我想创建一个名为WidgetArray
的模板容器类,它将自动生成一个小部件网格,并编辑它们的属性。但是,如果WidgetArray
包含一个带有字符串向量并将每个字符串分配给text
的{{1}}属性的函数,如果我声明{{1}的实例包含Label
s(没有文本属性),编译器抱怨。这似乎是模板专业化的完美案例。我正在cplusplus.com阅读有关模板专业化的页面,并看到了这一点:
当我们为模板类声明特化时,我们还必须定义它的所有成员,甚至是那些与通用模板类完全相同的成员,因为没有从通用模板到专门化的成员的“继承”。
请告诉我有办法解决这个问题。 WidgetArray
的绝大多数成员函数对于ProgressBar
的所有派生类都是完全有效的,而且我必须复制并粘贴整个代码以使{WidgetArray
非常愚蠢。 {1}}只是为派生类添加一个专用函数。
这是我的代码的简化版本:
Widget
我希望我的问题很明确。我环顾四周,有关于模板专业化的帖子很多,但我找不到一个似乎回答我问题的帖子。
答案 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
};