Как реализовать шаблон для типов и указателей на типы?
От: Frostyland  
Дата: 18.02.04 06:44
Оценка:
Хелое!

Коллеги, вот такой вопрос.
Есть необходимость создавать спец-классы для типов и указателей на них.
Типы имеют некую вирт.функцию f(), которая должна вызываться из спецкласса.

Реализуя шаблон типа
template<typename T>
class ObjectHolder
{
public:
  __fastcall ObjectHolder(T Obj) : FData(Obj){};
  virtual void __fastcall Show(){FData.f();};
  T FData;
};

мы не можем параметризовать его указателем, а типа
template<typename T>
class ObjectHolder
{
public:
  __fastcall ObjectHolder(T Obj) : FData(Obj){};
  virtual void __fastcall Show(){FData->f();};
  T FData;
};

можем хранить тока указатели
А можна как-то решить такую проблему вот так:
type t;
type* pt;

Base* bt = new ObjectHolder<some_type>(t);
Base* bpt = new ObjectHolder<some_type*>(pt);
bt->Show();
bpt->Show();

то есть, шаблон с АВТОМАТИЧЕСКИМ РАЗНЫМ ИНСТАНЦИРОВАНИЕМ для типов и указателей на оные...

С уважением, ВК
С уважением, В.Куликов
Re: Как реализовать шаблон для типов и указателей на типы?
От: folk Россия  
Дата: 18.02.04 07:06
Оценка: 6 (2)
Здравствуйте, Frostyland, Вы писали:

F>Хелое!


F>Коллеги, вот такой вопрос.

F>Есть необходимость создавать спец-классы для типов и указателей на них.
F>Типы имеют некую вирт.функцию f(), которая должна вызываться из спецкласса.

F>Реализуя шаблон типа

F>
F>template<typename T>
F>class ObjectHolder
F>{
F>public:
F>  __fastcall ObjectHolder(T Obj) : FData(Obj){};
F>  virtual void __fastcall Show(){FData.f();};
F>  T FData;
F>};
F>

F>мы не можем параметризовать его указателем, а типа
F>
F>template<typename T>
F>class ObjectHolder
F>{
F>public:
F>  __fastcall ObjectHolder(T Obj) : FData(Obj){};
F>  virtual void __fastcall Show(){FData->f();};
F>  T FData;
F>};
F>

F>можем хранить тока указатели
F>А можна как-то решить такую проблему вот так:
F>
F>type t;
F>type* pt;

F>Base* bt = new ObjectHolder<some_type>(t);
F>Base* bpt = new ObjectHolder<some_type*>(pt);
bt->>Show();
bpt->>Show();
F>

F>то есть, шаблон с АВТОМАТИЧЕСКИМ РАЗНЫМ ИНСТАНЦИРОВАНИЕМ для типов и указателей на оные...

F>С уважением, ВК


Используй частичную специализацию:

template<typename T>
class ObjectHolder
{
public:
  __fastcall ObjectHolder(T Obj) : FData(Obj){};
  virtual void __fastcall Show(){FData.f();};
  T FData;
};

template<typename T>
class ObjectHolder<T*>
{
public:
  __fastcall ObjectHolder(T* Obj) : FData(Obj){};
  virtual void __fastcall Show(){FData->f();};
  T* FData;
};


Только чтобы виртуальные функции имели смысл, шаблоны наверное должны наследоваться от общего предка-интерфейса.
И объект в конструктор лучше передавать по константной ссылке.
И ; после определения функций не должно быть.
И __fastcall скорее всего не нужен в конструкторе, поскольку он inline, и в Show, поскольку она не берет аргументов.
На самом деле, люди не читают газеты, они принимают их каждое утро, так же как ванну. ©Маршалл Мак-Льюэн
Re: Как реализовать шаблон для типов и указателей на типы?
От: nobody2 Россия  
Дата: 18.02.04 07:15
Оценка:
Здравствуйте, Frostyland, Вы писали:

F>Хелое!


F>...

F>то есть, шаблон с АВТОМАТИЧЕСКИМ РАЗНЫМ ИНСТАНЦИРОВАНИЕМ для типов и указателей на оные...

Насколько я помню, это можно сделать специализацией шаблона.
Кажется так:
template<typename T>
class ObjectHolder
{
public:
  __fastcall ObjectHolder(T Obj) : FData(Obj){};
  virtual void __fastcall Show(){FData.f();};
private:
  T FData;
};

template<typename T>
class ObjectHolder<T*>
{
public:
  __fastcall ObjectHolder(T* Obj) : FData(Obj){};
  virtual void __fastcall Show(){FData->f();};
private:
  T* FData;
};
Re[2]: Как реализовать шаблон для типов и указателей на типы
От: Frostyland  
Дата: 18.02.04 07:27
Оценка:
Приветствую, folk, Вы писали:

F>Только чтобы виртуальные функции имели смысл, шаблоны наверное должны наследоваться от общего предка-интерфейса.

Естессно, иначе [Base* p=SomeDerived]-то как???. Просто я не указал...

F>И объект в конструктор лучше передавать по константной ссылке.

Эт точно!

F>И ; после определения функций не должно быть.

Тоже верно

F>И __fastcall скорее всего не нужен в конструкторе, поскольку он inline, и в Show, поскольку она не берет аргументов.

А этого я не знал, спасиба!
С уважением, В.Куликов
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.