Squeak.ru - шаблоны программирования

Использовать тип данных (тип класса) в качестве ключа на карте

У меня есть класс Base и классы Derived_1, Derived_2... Мне нужны производные классы, чтобы иметь идентификатор. Эти идентификаторы используются для дальнейшего поиска и т. д., поэтому они должны быть последовательными (а не просто случайными числами). Поскольку производные классы создаются пользователем, id не может быть членом Derived_N. Так что я придумал DerivedType класс.

class DerivedType
{
    static unsigned id;
    unsigned m_id;
public:
    DerivedType() : m_id(id++) {  }
}

Теперь я хочу создать сопоставление между Derived_N и DerivedType. Всякий раз, когда создается Derived_N, это сопоставление проверяет, существует ли DerivedType для конкретного Derived_N, и возвращает его, в противном случае создает новое и сохраняет в карте.

Актуальный вопрос: есть ли способ использовать std::map с типом данных в качестве ключа на карте? Я не боюсь никаких шаблонно-метапрограммных решений. Или есть элегантный способ, как достичь моей цели?

редактировать Тип даты -> Тип данных, я имею в виду ClassType, извините :)

Я хочу использовать его как:

Derived_5 d;
DerivedType dt = getType(d); //Derived_5 is looked up in map, returning particular DerivedType
dt.getId();

каждый экземпляр Derived_N (с одинаковым «N») должен иметь один и тот же идентификатор через DerivedType.

EDIT2 – МОЙ ОТВЕТ Я нашел лучшее решение для своей проблемы... Вот оно:

atomic_counter s_nextEventClassID;

typedef int cid_t;

template<class EventClass>
class EventClassID
{
public:
    static cid_t getID()
    {
        static cid_t classID = EventClassID::next();
        return classID;
    }

    static cid_t next() { return ++s_nextEventClassID; }
};

поскольку мой вопрос заключался в том, как использовать тип данных на карте, я отмечу некоторые из ваших ответов, спасибо

25.03.2012

Ответы:


1

C++11 решает эту проблему, предоставляя std::type_index в <typeindex>, который является копируемым, сравнимым и хешируемым объектом, созданным из объекта std::type_info, который можно использовать в качестве ключа в ассоциативных контейнерах.

(Реализация довольно проста, поэтому, даже если у вас нет С++ 11, вы можете украсть реализацию, скажем, из GCC 4.7, и использовать ее в своем собственном коде.)

#include <typeindex>
#include <typeinfo>
#include <unordered_map>

typedef std::unordered_map<std::type_index, int> tmap;

int main()
{
    tmap m;
    m[typeid(main)] = 12;
    m[typeid(tmap)] = 15;
}
25.03.2012

2

Вы можете использовать typeid(object) напрямую, так как есть type_info::before, который можно использовать в качестве компаратора, если вы используете type_info в качестве ключа на карте, см. Для чего полезен `type_info::before`?. Не нужно получать .name().

25.03.2012

3

Вы можете использовать любой тип или класс, который вы хотите, в качестве ключа к std::map, при условии, что вы предоставите аргументам шаблона функцию сравнения, которая сообщает ему, как сортировать базовое дерево.

ИМХО, самое простое, что можно сделать для представления дат в виде ключей, - это преобразовать их в временные метки unix, но независимо от того, каким может быть их представление класса, просто предоставьте функцию сравнения для определения карты, и все готово.

25.03.2012
Новые материалы

Угловая структура архитектуры
Обратите внимание, что эта статья устарела, я решил создать новую с лучшей структурой и с учетом автономных компонентов: https://medium.com/@marekpanti/angular-standalone-architecture-b645edd0d54a..

«Данные, которые большинство людей используют для обучения своих моделей искусственного интеллекта, поставляются со встроенным…
Первоначально опубликовано HalkTalks: https://hacktown.com.br/blog/blog/os-dados-que-a-maioria-das-pessoas-usa-para-treinar-seus-modelos-de-inteligencia-artificial- ja-vem-com-um-vies-embutido/..

Сильный ИИ против слабого ИИ: различия парадигм искусственного интеллекта
В последние годы изучению и развитию искусственного интеллекта (ИИ) уделяется большое внимание и прогресс. Сильный ИИ и Слабый ИИ — две основные парадигмы в области искусственного интеллекта...

Правильный способ добавить Firebase в ваш проект React с помощью React Hooks
React + Firebase - это мощная комбинация для быстрого и безопасного создания приложений, от проверки концепции до массового производства. Раньше (знаете, несколько месяцев назад) добавление..

Создайте API с помощью Python FastAPI
Создание API с помощью Python становится очень простым при использовании пакета FastAPI. После установки и импорта вы можете создать приложение FastAPI и указать несколько конечных точек. Каждой..

Веселье с прокси-сервером JavaScript
Прокси-серверы JavaScript — это чистый сахар, если вы хотите создать некоторую общую логику в своих приложениях, чтобы облегчить себе жизнь. Вот один пример: Связь клиент-сервер Мы..

Получить бесплатный хостинг для разработчиков | Разместите свой сайт за несколько шагов 🔥
Статические веб-сайты — это веб-страницы с фиксированным содержанием и его постоянным содержанием. Но теперь статические сайты также обрабатывают динамические данные с помощью API и запросов...