用模板替换类定义宏

时间:2016-05-24 14:59:19

标签: c++ templates

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类插入两个或多个不同的列表中。我的问题是如何模板一和二?由于类的名称也显示为类型,这是否可能?我有这个由宏覆盖,但它可以用模板完成吗?如果代码结构发生了一些变化,我不介意,但这可以在没有宏的情况下完成吗?

2 个答案:

答案 0 :(得分:0)

当然,您可以将ListItem作为模板:

template<class T>
class ListItem
{
    T*   GetPrev     ();
    T*   GetNext     ();
    // ... and many more
};

class One : public ListItem<One>

这是一种奇怪的重复出现的模板模式。

答案 1 :(得分:0)

您可以使用奇怪的重复模板模式,甚至还有ListItem个父级。但请考虑使用一些std::vectorstd::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
{
};