универсальный тип
От: larry_g  
Дата: 15.11.02 09:37
Оценка:
есть такое (утрировано ):
class Stuff
{
Type* t;
public:
Type* GetType() {return t};
};

class Type
{
//......
public:
virtual Type* GetValue() {.....};
//......
};

class TypeInt: public Type
{
int i;
public:
// инициализация i
Type* GetValue() {return &i;}; // или что возвращать?
//.....
};

тоже для типов double, char* ...

потом где-то в

void f ()
{
Stuff* vec[100] ;
Stuff* p1=new Stuff(new Type);
Stuff* p2=new Stuff(new TypeInt);
// vec [100] состоит из p1,p2 ...

vec[i-e]->GetType()->GetValue() — вернет Type*
Дальше можно сделать преобразования Type* к unsigned int* или unsigned char* и т.д
в зависимости от потомков Type т.е. какой -то переключатель ставить.
Как бы Без этих преобразований , но чтобы не вводить новые классы получать именно
правильное значение от GetValue ( т.е. для TypeInt например , получить значение i
( выше в псевдокоде)?


}
Re: универсальный тип
От: Klestov  
Дата: 15.11.02 16:12
Оценка:
Здравствуйте, larry_g, Вы писали:

LG>void f ()

LG>{
LG>Stuff* vec[100] ;
LG>Stuff* p1=new Stuff(new Type);
LG>Stuff* p2=new Stuff(new TypeInt);
LG>// vec [100] состоит из p1,p2 ...

LG> vec[i-e]->GetType()->GetValue() — вернет Type*


LG><...>


LG>Как бы Без этих преобразований , но чтобы не вводить новые классы получать именно правильное значение от GetValue ( т.е. для TypeInt например , получить значение i ( выше в псевдокоде)?


Может поможет

//---------------------------------------------------------------------------
#include <vector>
#include <string>
#include <iostream>

//---------------------------------------------------------------------------
#define FOREACH(VAR,CONTAINER,TYPE) \
  for (TYPE::iterator VAR = (CONTAINER).begin(),last = (CONTAINER).end();VAR != last;VAR++)

//---------------------------------------------------------------------------
using namespace std;

//---------------------------------------------------------------------------
class TCustomValue {
protected:
        vector<TCustomValue *> m_Values;

public:
        TCustomValue (void) { /* NONE */ }

        virtual ~TCustomValue (void)
        {
           FOREACH(Item, m_Values, vector<TCustomValue *>)
           {
              delete (*Item);
           }
        }

        virtual void * GetObjectAddress (void)
        {
           return (NULL);
        }

        void AddValue (TCustomValue * _Value)
        {
           m_Values.push_back(_Value);
        }

        TCustomValue * GetField (int _Index)
        {
           return (m_Values[_Index]);
        }

        template <class T>
        T GetValue (void)
        {
           return (*((T *)(GetObjectAddress())));
        }

        template <class T>
        void SetValue (T _Value)
        {
           (*((T *)(GetObjectAddress()))) = _Value;
        }
};

//---------------------------------------------------------------------------
class TCustomValueFactory {
protected:
        vector<TCustomValueFactory *> m_Factorys;

public:
        TCustomValueFactory (void)  { /* NONE */ }

        virtual ~TCustomValueFactory (void)
        {
           FOREACH(Item, m_Factorys, vector<TCustomValueFactory *>)
           {
              delete (*Item);
           }
        }

        virtual void AddFactory (TCustomValueFactory * _Factory)
        {
           m_Factorys.push_back(_Factory);
        }

        virtual TCustomValue * CreateObject (void)
        {
           TCustomValue * Result;

           Result = new TCustomValue;

           FOREACH(Item, m_Factorys, vector<TCustomValueFactory *>)
           {
              Result->AddValue((*Item)->CreateObject());
           }

           return Result;
        }
};

//---------------------------------------------------------------------------
template <class T>
class TValue : public TCustomValue {
protected:
        T m_Value;

public:
        TValue (void)  { /* NONE */ }
        virtual ~TValue (void)  { /* NONE */ }

        virtual void * GetObjectAddress (void)
        {
           return (&m_Value);
        }
};

//---------------------------------------------------------------------------
template <class T>
class TValueFactory : public TCustomValueFactory {
public:
        TValueFactory (void)  { /* NONE */ }
        virtual ~TValueFactory (void)  { /* NONE */ }

        virtual TCustomValue * CreateObject (void)
        {
           return (new TValue<T>);
        }
};

//---------------------------------------------------------------------------
void Test (void)
{
/*
Àíàëîã:

struct TMyClass1 {
        long   m_Field_0;
        double m_Field_1;
        string m_Field_2;
};

struct TMyClass2 {
        long      m_Field_0;
        double    m_Field_1;
        string    m_Field_2;
        TMyClass1 m_Field_4;
};

TMyClass2 * Value = new TMyClass2;

Value->m_Field_0 = 10;
Value->m_Field_1 = 333.777;
Value->m_Field_2 = "Test String";

Value->m_Field_3.m_Field_0 = 101;
Value->m_Field_3.m_Field_1 = 1333.777;
Value->m_Field_3.m_Field_2 = "2 Test String 2";

cout << Value->m_Field_0;
cout << Value->m_Field_1;
cout << Value->m_Field_2;

cout << Value->m_Field_3.m_Field_0;
cout << Value->m_Field_3.m_Field_1;
cout << Value->m_Field_3.m_Field_2;

delete Value;
*/

        TCustomValueFactory * Factory1;
        TCustomValueFactory * Factory2;
        TCustomValue * Value;

        // struct TMyClass1 {
        //        long   m_Field_0;
        //        double m_Field_1;
        //        string m_Field_2;
        // };
        Factory1 = new TCustomValueFactory;

        Factory1->AddFactory(new TValueFactory<long>);
        Factory1->AddFactory(new TValueFactory<double>);
        Factory1->AddFactory(new TValueFactory<string>);
        // ----------------

        // struct TMyClass2 {
        //        long      m_Field_0;
        //        double    m_Field_1;
        //        string    m_Field_2;
        //        TMyClass1 m_Field_4;
        // };
        Factory2 = new TCustomValueFactory;

        Factory2->AddFactory(new TValueFactory<long>);
        Factory2->AddFactory(new TValueFactory<double>);
        Factory2->AddFactory(new TValueFactory<string>);
        Factory2->AddFactory(Factory1);
        // ----------------

        // TMyClass2 * Value = new TMyClass2;
        Value = Factory2->CreateObject();

        // Value->m_Field_0 = 10;
        Value->GetField(0)->SetValue<long>(10);
        // Value->m_Field_1 = 333.777;
        Value->GetField(1)->SetValue<double>(333.777);
        // Value->m_Field_2 = "Test String";
        Value->GetField(2)->SetValue<string>("Test String");

        // Value->m_Field_3.m_Field_0 = 101;
        Value->GetField(3)->GetField(0)->SetValue<long>(101);
        // Value->m_Field_3.m_Field_1 = 1333.777;
        Value->GetField(3)->GetField(1)->SetValue<double>(1333.777);
        // Value->m_Field_3.m_Field_2 = "2 Test String 2";
        Value->GetField(3)->GetField(2)->SetValue<string>("2 Test String 2");

        // cout << Value->m_Field_0;
        cout << Value->GetField(0)->GetValue<long>();
        // cout << Value->m_Field_1;
        cout << Value->GetField(1)->GetValue<double>();
        // cout << Value->m_Field_2;
        cout << Value->GetField(2)->GetValue<string>();

        // cout << Value->m_Field_3.m_Field_0;
        cout << Value->GetField(3)->GetField(0)->GetValue<long>();
        // cout << Value->m_Field_3.m_Field_1;
        cout << Value->GetField(3)->GetField(1)->GetValue<double>();
        // cout << Value->m_Field_3.m_Field_2;
        cout << Value->GetField(3)->GetField(2)->GetValue<string>();

        // delete Value;
        delete Value;

        delete Factory2;
}


Избыточное цитирование удалено модератором. -- ПК
Re: универсальный тип
От: Анатолий Широков СССР  
Дата: 15.11.02 20:09
Оценка:
http://www.rsdn.ru/Forum/Message.aspx?mid=98481
Автор: Анатолий
Дата: 11.09.02
— там приводилось множество вариантов.
Re: универсальный тип
От: _grom_  
Дата: 16.11.02 22:24
Оценка:
Посмотри boost::any из библиотеки boost (http://www.boost.org).
возможно поможет.
Re: универсальный тип
От: Sergey Россия  
Дата: 18.11.02 14:29
Оценка:
Я б посоветовал вот это прочитать: http://oonumerics.org/tmpw01/alexandrescu.pdf
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.