Я хочу сохранить какой-то контейнер, где тип сопоставляется с одним значением типа. Так что, по сути, я хочу, чтобы std::map<std::typeindex, T>
, где T зависит от типа, с которым я индексирую его. std::map
не похож на хороший способ сделать это, потому что типы жесткие. Какое простейшее решение я могу использовать для этого?Реестр данных различных типов
ответ
Если карта в контейнер типа стертым как boost::any
, вы можете по крайней мере восстановить тип, если вы знаете, что это такое:
std::map<std::typeindex, boost::any> m;
m[typeid(Foo)] = Foo(1, true, 'x');
Foo & x = boost::any_cast<Foo&>(m[typeid(Foo)]);
Какие преимущества у этого есть над чем-то вроде 'void *'? – user2852456
@ user2852456: Попробуйте написать его с 'void *' и сравните! –
@ user2852456: Хорошо, это может быть трудно оценить, но вы можете убедиться, что решение, которое я представляю, не имеет UB, тогда как тот, который вы собираетесь писать, будет намного более хрупким. –
Вы можете использовать shared_ptr<void>
:
std::map<std::typeindex, std::shared_ptr<void>> m;
m[typeid(T)] = std::make_shared<T>(...);
auto pT = std::static_pointer_cast<T>(m[typeid(T)]); // pT is std::shared_ptr<T>
Или, конечно, вы бы добавили некоторую оболочку, чтобы убедиться, что два T
s на строку соответствуют друг другу, и вы случайно не получаете доступ к пустому shared_ptr<void>
.
Это решение выглядит синтаксически красивым (и +1 для этого), но следует отметить, что вы также оплачиваете цену стирания типа здесь, но вы также платите за совместную семенную семантику без участия гонок, хотя это может и не быть быть желательным, а статический бросок требует дисциплины для создания четко определенного поведения. «Boost :: any_cast» по контрасту никогда не вызывает UB. –
@KerrekSB Учитывая, что ОП немного расплывчато по поводу требований, я думаю, что все в порядке, что все мы предлагаем некоторые варианты, и ОП может анализировать и выбирать то, что лучше для него. (и, следовательно, +1 для вашего ответа) –
- 1. Аргументом различных типов данных
- 2. Итерирование списка различных типов данных?
- 3. Обработка нескольких различных типов данных
- 4. Указатели в различных типов данных
- 5. Чтение из данных различных типов
- 6. Concat различных типов наблюдаемых
- 7. Перебор различных типов
- 8. Волатильность различных типов памяти
- 9. PHP-массив различных типов
- 10. Список различных типов?
- 11. Сравнение различных типов данных в ML
- 12. памяти различных типов данных в Java
- 13. Хранение различных типов данных в java (android)
- 14. Ввод различных типов данных, разделенных пробелом
- 15. SQL-дизайн для различных типов данных
- 16. табличного дерево: Отображение различных типов данных
- 17. Хранение различных типов данных в NSArray
- 18. Сохранение различных типов значений в базе данных
- 19. базы данных: один для многих различных типов
- 20. C++ изменяемый массив различных типов данных?
- 21. Интерфейс Java для сравнения различных типов данных
- 22. Получить индекс ArrayList различных типов данных
- 23. Анализ различных типов данных с ввода java
- 24. Чтение различных типов данных из файла
- 25. Загрузка различных типов данных из текстового файла
- 26. Извлечение различных типов данных из строки
- 27. Объединение различных типов данных списка в строку
- 28. Обработка различных типов данных в одной структуре
- 29. Преобразование различных типов значений реестра в строку?
- 30. Определить переменную различных типов
Существует ли фиксированный набор типов для 'T'? –
Вы можете нанести на карту 'boost :: any' возможно? –
@ Даниэль Фрей: Да. Но я не хочу повторять что-то. Объявление того, что тип 'A' принадлежит' T', является, по-моему, повторением объявления типа 'A'. – user2852456