带有模板容器的协变返回类型
是否可以进行以下工作?基本上我想要 Ptr成为 Ptr 可接受的返回类型替代。
template<typename T>
class Ptr {
public:
explicit Ptr (T * ptr) : ptr(ptr) {}
T * ptr;
};
class A {
virtual Ptr<A> foo () {
return Ptr<A>(NULL);
}
};
class B : public A {
virtual Ptr<B> foo () { // BAD! Ptr<B> is not compatable
return Ptr<B>(NULL);
}
};
Is it possible to make the following work? Basically I want Ptr<B> to be an acceptable return type replacement for Ptr<A>.
template<typename T>
class Ptr {
public:
explicit Ptr (T * ptr) : ptr(ptr) {}
T * ptr;
};
class A {
virtual Ptr<A> foo () {
return Ptr<A>(NULL);
}
};
class B : public A {
virtual Ptr<B> foo () { // BAD! Ptr<B> is not compatable
return Ptr<B>(NULL);
}
};
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
您可以使用奇怪的重复模板来用模板函数返回替换虚拟函数重载。以下文章可能会有所帮助:
http://en.wikipedia.org/wiki/Curiously_recurring_template_pattern
另请检查下面的代码:
Your can use curiously recurring templates to replace virtual function overloads with template function returns. The following article might help:
http://en.wikipedia.org/wiki/Curiously_recurring_template_pattern
Also check the following code:
根据标准:
重写函数的返回类型应与被重写函数的返回类型相同或与函数的类协变。如果函数 D::f 重写函数 B::f,则函数的返回类型在满足以下条件的情况下是协变的:
因此,在您的示例中,返回类型并不是真正协变的(它们不是指针也不是引用),而且
Ptr
和Ptr
是不相关的类型。因此,保持 foo 为虚拟并在 A 中返回
Ptr
并在 B 中返回Ptr
是不可能的。如果您可以/愿意放弃虚拟,那么您可以使用 Cem Kalyoncu 提案或其变体中的某些内容。According to the standard:
The return type of an overriding function shall be either identical to the return type of the overridden function or covariant with the classes of the functions. If a function D::f overrides a function B::f, the return types of the functions are covariant if they satisfy the following criteria:
So in your example the return types are not really covariant (they are not pointers nor references) and moreover
Ptr<B>
andPtr<A>
are unrelated types.So keeping foo virtual and returning
Ptr<A>
in A andPtr<B>
in B is not possible. If you can/are willing to drop virtual than you can use something in the lines of Cem Kalyoncu's proposal or a variation of it.你可以尝试这样的事情:
You could try something like this: