Контейнер templateStruct <T>с переменным Т - PullRequest
0 голосов
/ 24 августа 2011

У меня есть простая структура, которая содержит элементы управления GUI в приложении, над которым я работаю. Структура определяется как

template<class T>
struct guiControl
{
    T minValue
    T defaultValue
    ...
}

Каждый элемент управления идентифицируется уникальным целочисленным идентификатором в моем приложении. Я хотел бы получить доступ к структурам с map<int, guiControl>, но это не разрешено:

шаблон неспециализированного класса нельзя использовать в качестве аргумента шаблона для параметра шаблона ... использование шаблона класса требует списка аргументов шаблона .

ОК, это имеет смысл для меня - компилятор должен точно знать, сколько места требуется типу значения карты. Но есть ли для меня какой-то другой способ приблизиться к этому поведению - желательно не входя в Boost или более сложную классовую иерархию?

1 Ответ

0 голосов
/ 24 августа 2011

Не имеет смысла получать доступ к вашим элементам управления на одной карте, потому что они имеют различный тип, что означает, что вы не можете выполнять одни и те же методы на них и т. Д. *

Что вы можете сделать, это определить общий класс, содержащий элементы, которые должен иметь каждый элемент управления, а затем получить специальные элементы управления из этого класса:

template<class T>
class guiControl
{
  T minValue;
  T defaultValue;
  /* ... */
}

Пример для элементов управления:

class Button : public guiControl<int>
{
   /* ... */
   int get_id() { return id; }
}

Тогда вы все еще можете сделать карту идентификаторов и указателей на ваши объекты, когда вы приведете указатели объектов к типу базового класса:

map<int, guiControl<int>* > controls;
Button button;
controls[button.get_id()] = dynamic_cast<guiContorl<int>*>(&button);

Теперь вы можете получить доступ к guiControl членам (например, minValue) ваших элементов управления по идентификатору и даже привести их к их производному типу, но тогда вам нужно будет знать, к какому типу они относятся.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...