#include <iostream>
#include <string>
#include <boost/lexical_cast.hpp>
using namespace std;
using namespace boost;
template <class DependingObjectT>
class has_dependency_pointer {
template <class Derived>
friend class get_depending_object;
DependingObjectT *m_pDependingObject;
};
template<typename T>
struct identity {
typedef T type;
};
template <class Derived>
class get_depending_object {
public:
template <class T>
T &GetDependingObject() const
{
return *static_cast<T *>(static_cast<const Derived *>(this)->has_dependency_pointer<typename T::__base_t>::m_pDependingObject);
}
template <class T>
void SetDependingObject(T *pObject)
{
static_cast<Derived *>(this)->has_dependency_pointer<typename T::__base_t>::m_pDependingObject = pObject;
}
};
class Base1 {
public:
typedef Base1 __base_t;
int N;
};
class Derived1 : public Base1 {
public:
int N2;
};
class Base2 {
public:
typedef Base2 __base_t;
float F;
};
class Derived2 : public Base2 {
public:
float F2;
};
class A : public has_dependency_pointer<Base1>, public has_dependency_pointer<Base2>, public get_depending_object<A> {
};
int main()
{
A a;
Derived1 d;
a.SetDependingObject(&d);
cout << lexical_cast<string>(&a.GetDependingObject<Derived1>()) << endl;
return 0;
}