Re: Covariant return types and interdependent classes
Am 31.08.2011 14:52, schrieb Javier:
I'm having a problem trying to get two classes that refer to each
other take a covariant return type. While this is occurring in the
Visual C++ 2010 compiler (and I'm posting a modified version here of
my original post in the C++ forums at MS), I have a more general
question, namely if there is a way for a compiler to pass what would
be, in my opinion, valid code for covariant return types, or if I'm at
the mercy of the compiler vendor :-)
[..]
To solve your problem practically, you could consider to take advantage
of two helper class templates as shown below. This approach uses the NVI
(non-virtual interface) idiom and has other advantages, too (E.g. it is
easy to simulate covariant return types with smart pointers):
#include <type_traits>
struct base2;
struct base1 {
protected:
virtual base2* doGetBase2() const = 0;
};
struct base2 {
protected:
virtual base1* doGetBase1() const = 0;
};
template<class Derived>
struct base1_nvi : public base1 {
public:
Derived* getBase2() const {
static_assert(std::is_base_of<base2, Derived>::value, "Derived must be a sub-class of base2");
return static_cast<Derived*>(this->doGetBase2());
}
};
template<class Derived>
struct base2_nvi : public base2 {
public:
Derived* getBase1() const {
static_assert(std::is_base_of<base1, Derived>::value, "Derived must be a sub-class of base1");
return static_cast<Derived*>(this->doGetBase1());
}
};
struct derived1;
struct derived2 : public base2_nvi<derived1> {
protected:
virtual base1* doGetBase1() const override { return ...; }
};
struct derived1 : public base1_nvi<derived2> {
protected:
virtual base2* doGetBase2() const override { return ...; }
};
Even though this example uses some C++11 language tools, these can be
easily replaced by corresponding boost tools in a complete C++03
conforming code.
HTH & Greetings from Bremen,
Daniel Kr?gler
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]