Re: covariant return types with CRTP
iwongu wrote:
So I changed the code like the following.
template <class T, class U>
struct clonable : U
{
T* clone() const { // (8)
T const* d = static_cast<T const*>(this);
return new T(*d);
}
};
struct B
{
virtual ~B() {}
virtual B* clone() const = 0; // (17)
};
struct D : clonable<D, B>
{ // (21)
};
[...]
I think that this should be treated as a covariance return type case
according to the 10.3.5 of the C++98.
To understand, look at the equivalent non-compilable code:
struct B
{
virtual ~B() {}
virtual B* clone() const = 0;
};
struct D;
struct clonable_D_B : B
{
D* clone() const; // is D derived from B? don't know yet.
};
struct D : clonable_D_B // now I know that D is derived from B.
{
};
inline D* clonable_D_B::clone() const {
D const* d = static_cast<D const*>(this);
return new D(*d);
}
If I change the line (8) from "T* clone() const {" to "U* clone() const
{", it compiles cleanly. But I can't get the D* from it with this.
Why not? The known paradigm is:
struct clonable
{
clonable* clone() const {
return do_clone();
}
virtual ~clonable() {}
protected:
virtual clonable* do_clone() const = 0;
};
template <class T, class U = clonable>
struct clonable_impl : U
{
T* clone() const {
return static_cast<T*>(do_clone());
}
protected:
U* do_clone() const {
T const* d = static_cast<T const*>(this);
return new T(*d);
}
};
struct B : clonable
{
};
struct D : clonable_impl<D, B>
{
};
--
Andrei Polushin
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]