class ListItem
{
ListItem* GetPrev ();
ListItem* GetNext ();
// ... and many more
};
class One : public ListItem
{
One* GetPrev () { return static_cast<One*>(ListItem::GetPrev()); }
One* GetNext () { return static_cast<One*>(ListItem::GetNext()); }
// ... and many more overrides
};
class Two : public ListItem
{
Two* GetPrev () { return static_cast<Two*>(ListItem::GetPrev()); }
Two* GetNext () { return static_cast<Two*>(ListItem::GetNext()); }
// ... and many more overrides
};
class Object : public One, public Two
{
};
这样做的目的是将Object类插入两个或多个不同的列表中。我的问题是如何模板一和二?由于类的名称也显示为类型,这是否可能?我有这个由宏覆盖,但它可以用模板完成吗?如果代码结构发生了一些变化,我不介意,但这可以在没有宏的情况下完成吗?
答案 0 :(得分:0)
当然,您可以将ListItem
作为模板:
template<class T>
class ListItem
{
T* GetPrev ();
T* GetNext ();
// ... and many more
};
class One : public ListItem<One>
这是一种奇怪的重复出现的模板模式。
答案 1 :(得分:0)
您可以使用奇怪的重复模板模式,甚至还有ListItem
个父级。但请考虑使用一些std::vector
或std::list
,无需重新发明模板列表...特别是,来自Object
级别的调用必须看起来像这样:
Object o;
One* prev = o.One::GetPrev();
工作代码(http://ideone.com/dbmwFZ):
struct ListItem
{
ListItem* GetPrev ();
ListItem* GetNext ();
// ... and many more
};
template <typename T>
struct ListItemT : ListItem
{
T* GetPrev () { return static_cast<T*>(ListItem::GetPrev()); }
T* GetNext () { return static_cast<T*>(ListItem::GetNext()); }
};
struct One : ListItemT<One>
{
};
class Two : public ListItemT<Two>
{
};
class Object : public One, public Two
{
};