模板类和基类?

时间:2012-09-01 00:52:54

标签: c++ templates base-class

我有一个基类IStructure,它是由许多类派生的。

其中一些类'引用'其他IStructure类。例如,我的班级class GuiButton : public IStructure的成员Textstring(也来自IStructure)。

现在我只是闪闪发光,所以我可以说到这一点,所以这对你们中的一些人来说可能看起来很奇怪。我想要一个引用IStructure的模板类'Reference'。例如:

class GuiButton : public IStructure {
public:
    Reference<Textstring> Text;
};

我知道有些人可能想知道我为什么不做Textstring* Text。这是因为其中一些引用是“外部的”。 Reference模板类仅保存有关IStructure的信息(即名称等)。其中一些类非常庞大,将整个类实例化为只使用Name属性而不是它是没有意义的。这有意义吗?

现在问我的问题:

class Textstring : public IStructure;

我可以使用我的模板引用Textstring

Reference<Textstring> Text;

现在问题在于:我要求我将一些方法转发到“IStructure”,例如:

void RegisterReference(Reference<IStructure> &reference);

所以我不能这样做:

Reference<Textstring> txt("TextName");
RegisterReference(txt); // error

我知道我可以通过不让Reference成为模板来解决这个问题,但我真的很想,因为这样可以更容易理解并知道引用的类型。

我有什么方法可以做到这一点?

感谢您的帮助!

-Alex

2 个答案:

答案 0 :(得分:3)

正如@dasblinkenlight建议的那样,您可以模板化您的库函数。或者,您可以向Reference类添加一些“差异”:

template<typename T>
class Reference
{
    // ...
public:
    template<typename U>
    Reference(Reference<U> const & r) {
        // "copy" r into *this
    }
};

或使用转换运算符

template<typename T>
class Reference
{
    // ...
public:
    template<typename U>
    operator Reference<U>() {
        // convert Reference<T> into Reference<U>
    }
};

这种方法的缺点是,每次需要向上播放时,实际上都在创建新对象。

修改

感谢Luc Danton指出这一点。我编写的代码处理的方式不仅仅是upcast。它会做任何可用的转换。为了更好地限制事物,我们可以做这样的事情(在C ++ 11中):

template<typename T>
class Reference
{
    // ...
public:
    template<typename U,
      typename = typename std::enable_if<std::is_base_of<T, U>::value>::type>
    Reference(Reference<U> const & r) {
        // "copy" r into *this
    }
};

答案 1 :(得分:2)

您可以在Reference的类型参数上使您的函数成为模板,如下所示:

template <typename R>
void RegisterReference(Reference<R> &r);