Указатель на экземпляр класса, созданного на основании шаблона класса
От: Melamed Россия  
Дата: 22.06.21 15:18
Оценка:
Определен шаблон

template<class T = CEdit> class CGridEdit : public T
{
public
    ...
    void EndEdit(BOOL bSave)
    {
      ...
    }
    ...
};


Где T класс-потомок от CEdit;

Необходимо определить указатель на класс CGridEdit<T>, где T — класс потомок класса CEdit, зависит от того, какой тип данных обрабатывается в ячейки таблицы
Могу ли я определить указатель, для вызова метода EndEdit(), который определен в шаблоне так:

CGridEdit<CEdit> *pEdit;
Re: Указатель на экземпляр класса, созданного на основании шаблона класса
От: vopl Россия  
Дата: 22.06.21 16:52
Оценка:
Здравствуйте, 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;
}
Re: Указатель на экземпляр класса, созданного на основании шаблона класса
От: vopl Россия  
Дата: 22.06.21 17:35
Оценка: 1 (1)
или полиморфностью можно, через указатель на базу, тогда вообще не важно являются ли наследники шаблонными
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;
}
Re: Указатель на экземпляр класса, созданного на основании шаблона класса
От: Кодт Россия  
Дата: 29.06.21 14:27
Оценка:
Здравствуйте, 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; }
  ......
};
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.