C ++ Как хранить коллекцию шаблонов объектов независимо от темпатов - PullRequest
2 голосов
/ 04 февраля 2010

У меня проблема с реализацией библиотеки таблиц базы данных. У меня есть класс Column для хранения разных типов.

template <class T>
class Column : iColumn<T>
{ 
... 
}

Таблица состоит из столбцов, поэтому мне нужен набор из них (карта с именем строки в качестве ключа и столбцом в качестве значения). Как реализовать одну коллекцию всех столбцов таблицы независимо от типа шаблона?

Спасибо за любую гепатит.

Ответы [ 5 ]

5 голосов
/ 04 февраля 2010

У вас должен быть общий интерфейс.

class Column<T>: public IColumn {
  ...
};

std::map<std::string,IColumn*> columns;
4 голосов
/ 04 февраля 2010

Некоторые альтернативы:

  1. Boost Fusion http://www.boost.org/doc/libs/1_42_0/libs/fusion/doc/html/index.html

  2. Создать контейнер Boost any

  3. Сделать шаблонный класс наследуемым от того же класса и сохранить указатели

  4. Поскольку это выглядит как база данных, просто используйте строки вместо разных типов.

2 голосов
/ 04 февраля 2010

Ваши типы, с точки зрения системы типов C ++, совершенно не связаны.Чтобы вызвать отношения, требуется какое-то стирание типа ;это может быть либо обычно реализуемый интерфейс, либо механизм, подобный Boost.Any, как предлагали другие.

Однако, обратите внимание, что объединение разных вещей - это не очень хороший дизайн, поэтому вам, вероятно, стоит добавитьхотя в значимом общем интерфейсе, который позволяет вам делать все необходимые вещи без чрезмерного подавления в дальнейшем.

2 голосов
/ 04 февраля 2010

Вы можете рассмотреть возможность использования boost :: any или boost :: option для готовых решений. Или вы можете рассмотреть возможность предоставления базового типа столбца, который является корнем иерархии столбцов. Кажется, что у всех столбцов есть что-то общее (вероятно, имя как минимум). Все шаблонные типы столбцов будут производными от него.

Я сам, вы идете по старому доброму пути и реализуете иерархию с шаблоном посетителя (двойная диспетчеризация) для операций, которые должны выполняться в производных элементах и ​​не присутствуют в основе иерархии.

1 голос
/ 04 февраля 2010

Я думаю, что boost :: any может помочь вам в этом ...

...