Subject: [boost] typeof or similar
From: Steffen Roeber (Steffen.Roeber_at_[hidden])
Date: 2010-02-23 04:50:59


Hi,

I have 3 classes:

1.

class Base

{

public:

  virtual Base *createDerived()

  {

    return 0;

  }

};

 

2.

template <class T>

class BaseT : public Base

{

public:

  virtual Base *createDerived()

  {

    return new DerivedT<T>(); //nicht smart, because DerivedT must be known

  }

};

 

3.

template <class T>

class DerivedT : public BaseT<T>

{

 

};

 

So far so good. Or not. But now the problems are starting.

Base *base = new BaseT<int>;

 

This object it created at a place that is not known where I want to create:

Base *derived = base->createDerived(); //base is a Base *

 

The result is an object that has the same template type as 'base'.

Finally I got my desired result, but the problem is the relation downward
relation between BaseT and DerivedT.

 

My preferred way would be something like a factory:

class Factory

{

public:

  template <class T>

  static Base *createDerived<T>()

  {

    return new DerivedT<T>();

  }

};

 

But how can I tell the factory which type to be used.

Base *derived = Factory::createDerived<sameAsBase> (base); //base is a Base
*

 

I think there is no "normal" C++ language support. But Boost has some
methods that by-pass some language constraints. I took a loot at something
like 'typeof'. But I don't get the things together.

Has anybody any idea? Or is it impossible to do this?

 

Kind regards

Steffen