Хелое!
Коллеги, вот такой вопрос.
Есть необходимость создавать спец-классы для типов и указателей на них.
Типы имеют некую вирт.функцию 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();
то есть, шаблон с АВТОМАТИЧЕСКИМ РАЗНЫМ ИНСТАНЦИРОВАНИЕМ для типов и указателей на оные...
С уважением, ВК
Здравствуйте, 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, поскольку она не берет аргументов.
На самом деле, люди не читают газеты, они принимают их каждое утро, так же как ванну. ©Маршалл Мак-Льюэн
Здравствуйте, 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;
};
Приветствую, folk, Вы писали:
F>Только чтобы виртуальные функции имели смысл, шаблоны наверное должны наследоваться от общего предка-интерфейса.
Естессно, иначе
[Base* p=SomeDerived]-то как???. Просто я не указал...
F>И объект в конструктор лучше передавать по константной ссылке.
Эт точно!
F>И ; после определения функций не должно быть.
Тоже верно
F>И __fastcall скорее всего не нужен в конструкторе, поскольку он inline, и в Show, поскольку она не берет аргументов.
А этого я не знал, спасиба!