我有一个基类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
答案 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);