Определен шаблон
template<class T = CEdit> class CGridEdit : public T
{
public
...
void EndEdit(BOOL bSave)
{
...
}
...
};
Где T класс-потомок от CEdit;
Необходимо определить указатель на класс CGridEdit<T>, где T — класс потомок класса CEdit, зависит от того, какой тип данных обрабатывается в ячейки таблицы
Могу ли я определить указатель, для вызова метода EndEdit(), который определен в шаблоне так:
CGridEdit<CEdit> *pEdit;
Здравствуйте, Melamed, Вы писали:
M>Определен шаблон
M>M>template<class T = CEdit> class CGridEdit : public T
M>{
M>public
M> ...
M> void EndEdit(BOOL bSave)
M> {
M> ...
M> }
M> ...
M>};
M>
M>Где T класс-потомок от CEdit;
M>Необходимо определить указатель на класс CGridEdit<T>, где T — класс потомок класса CEdit, зависит от того, какой тип данных обрабатывается в ячейки таблицы
M>Могу ли я определить указатель, для вызова метода EndEdit(), который определен в шаблоне так:
M>M>CGridEdit<CEdit> *pEdit;
M>
Именно так нельзя, это получается указатель на "другой" тип.. Можно примерно так
class CEdit {};
class CEditDerived : CEdit {};
template<class T = CEdit> class CGridEdit : public T
{
public:
void EndEdit(bool bSave)
{
}
};
template <class T = CEdit>
using CGridEditPtr = CGridEdit<T>*;
int main()
{
CGridEdit<CEditDerived> myGridEdit;
CGridEditPtr<CEditDerived> ptr = &myGridEdit;
ptr->EndEdit(true);
return 0;
}
или полиморфностью можно, через указатель на базу, тогда вообще не важно являются ли наследники шаблонными
class CEdit
{
public:
virtual void EndEdit(bool bSave)
{
}
};
class CEditDerived : public CEdit {};
template<class T = CEdit> class CGridEdit : public T
{
public:
void EndEdit(bool bSave) override
{
}
};
int main()
{
CGridEdit<CEditDerived> myGridEdit;
CEdit * ptr = &myGridEdit;
ptr->EndEdit(true);
return 0;
}
Здравствуйте, Melamed, Вы писали:
M>M>template<class T = CEdit> class CGridEdit : public T
M>
M>Где T класс-потомок от CEdit;
Тут, кстати, пригодились бы концепты:
template<std::derived_from<CEdit> T = CEdit> class CGridEdit : public T
(ну или на SFINAE, по-старинке)
M>Необходимо определить указатель на класс CGridEdit<T>, где T — класс потомок класса CEdit, зависит от того, какой тип данных обрабатывается в ячейки таблицы
M>Могу ли я определить указатель, для вызова метода EndEdit(), который определен в шаблоне так:
M>M>CGridEdit<CEdit> *pEdit;
M>
Так — нельзя, потому что есть иерархия
— CEdit <- CDerived <- CGridEdit<CDerived>
— CEdit <- CGridEdit<CEdit>
Можно пойти иным путём:
— завести нешаблонную базу — и унаследовать всех, кого надо, от неё
class CGridEditBase : public CEdit {
public:
void your_customization() override {.....}
virtual void your_additional_api() = 0;
...
};
template CGridEdit<std::derived_from<CGridEditBase> T> class CGridEdit : public T {
public:
void your_additional_api() override {.....}
};
— завести нешаблонную базу вне иерархии CEdit
class CGridEditBase {
public:
virtual CEdit* myself() = 0;
......
};
template CGridEdit<std::derived_from<CEdit> T> class CGridEdit : public T {
public:
CEdit* myself() { return this; }
......
};