Re[2]: static and reference. дополнительный вопрос
От: _Nomad  
Дата: 30.09.03 15:49
Оценка:
Здравствуйте, Анатолий Широков, Вы писали:

H>>в чем я неправ?


АШ>В том, что std::vector не является typename-ом. Либо тебе нужно уточнить тип данных для которого ты пишешь сортировку (например, std::vector<int>), либо параметризовать методы типом, с которым ты будешь работать:



АШ>
АШ>class QuickSort
АШ>{
АШ>public:
АШ>   template<typename T>
АШ>   static void Sort::QuickSort(std::vector<T> &v, int lo0, int hi0)
АШ>   {
АШ>      ...
АШ>   }
АШ>};

АШ>


Возник интересный вопрос по поводу темплейтов.. если у нас, допустим, описано так:

template<class T> class base
{
public:
      base() {};
      ~base() {};

   virtual void Set(T)=0;
   virtual T Get()=0;
};

class ibase: public base<int>
{
public:
   inline void Set(int value) {...}
   inline int Get() {...}
};

class fbase: public base<float>
{
public:
   inline void Set(float value) {...}
   inline float Get() {...}
};

class cbase: public base<char>
{
public:
   inline void Set(char value) {...}
   inline char Get() {...}
};


Как в таком случае:
1. в готовом экземпляре класса программно определить его тип;
2. передать какой-либо функции как параметр элемент произвольного типа.

пока придумал только в конструкторе инициализировать переменную, в которую записываю тип и крутиться с помощью void*.. т.е. делать так:

enum ntype {
   type_integer,
   type_float,
.....
}

template<class T> class base
{
public:
      base(ntype _type):type(_type) {};
      ~base() {};

   virtual void Set(T)=0;
   virtual T Get()=0;

public:
   ntype type;
};

class ibase: public base<int>
{
public:
   ibase():base<int>(type_integer) {};

   inline void Set(int value) {...}
   inline int Get() {...}
};

.....

void func(void * tmp)
{
   if (!tmp) return;
   switch(((base<void>*)tmp)->type)
   {
      case type_integer:
            ...
            break;
      case type_float:
            ...
            break;
      case type_char:
            ...
            break;
      ......
   }
}


может можно как-то правильнее указать ссылку на наследник такого класса? ведь все-равно он занимать памяти будет как указатель, но компилятор тип (base*) никак не воспринимает....
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.