Cycle of internal template template

Does anyone know how you can trick the C ++ compiler into compiling something like this (assuming the TheObservedObject remains inside MyClass):

template< typename Type >
class Observabile
{
public:
   typename typedef Type::TheObservedObject TheObject;

   void Observe( TheObject& obj ) {}
};

class MyClass : public Observabile< MyClass >
{
public:
   class TheObservedObject
   {
   };
}
+5
source share
3 answers

Unfortunately, this is not possible directly, because MyClass, at the time of creation Observable, it is not yet completed, and therefore you cannot access any typedefs. You can get around this by adding a small wrapper:

template< typename Type, typename Wrapper >
class Observable
{
public:
   typename typedef Wrapper::TheObservedObject TheObject;

   void Observe( TheObject& obj ) {}
};

struct MyClassWrapper{
   class TheObservedObject
   {
   };
};

class MyClass : public Observable< MyClass, MyClassWrapper>
{
public:
    typedef MyClassWrapper::TheObservedObject TheObservedObject;
};

Or just type TheObservedObjectout MyClass(Wrapper).

+1
source

, template Observable. .

// make inner class external
class TheObservedObject
{
  private: // make everything private
  friend class MyClass;  // make friends with original outer class
};

, TheObservedObject MyClass.

class Observabile<> 2 . , .

+1

, MyClass , Observable . . , - :

template<class T>
struct ObservedObject {};

template<class T>
class Observable
{
public:
    typedef typename ObservedObject<T>::type TheObject;

    void Observe(TheObject& obj) {}
};

class MyClass;  // forward decl

class MyClassObservedObject
{
    // define outside of MyClass
};

template<> struct ObservedObject<MyClass>
{
    typedef MyClassObservedObject type;
};

class MyClass : public Observable<MyClass>
{
    //
    // ...
    //

private:
    friend class MyClassObservedObject;
};
+1

All Articles