Мне нужно сохранить список векторов разных типов, на каждый из которых будет ссылаться строковый идентификатор. На данный момент я использую std::map
с std::string
в качестве ключа и boost::any
в качестве значения (пример реализации опубликован здесь).
Я не застрял при попытке запустить метод для всего сохраненного вектора, например:
std::map<std::string, boost::any>::iterator it;
for (it = map_.begin(); it != map_.end(); ++it) {
it->second.reserve(100); // FAIL: refers to boost::any not std::vector
}
Мои вопросы:
- Можно ли привести
boost::any
к произвольному векторному типу, чтобы я мог выполнять его методы? - Есть ли лучший способ сопоставить векторы произвольных типов и получить их позже с правильным типом?
В настоящее время я играю с альтернативной реализацией, которая заменяет boost::any
указателем на базовый класс контейнера, как это предлагается в этот ответ. Это открывает целую новую банку червей с другими проблемами, которые мне нужно решить. Я рад пойти по этому пути, если это необходимо, но мне все еще интересно узнать, смогу ли я заставить его работать с boost::any
, или есть ли другие лучшие решения.
P.S. Я новичок в C++ n00b (и слишком долго был избалован динамической типизацией Python), так что, возможно, я поступаю неправильно. Жёсткая критика (в идеале с последующими предложениями) приветствуется.
Большая картинка:
Как указано в комментариях, это вполне может быть проблемой XY, поэтому вот обзор того, чего я пытаюсь достичь.
Я пишу планировщик задач для среды моделирования, которая управляет выполнением задач; каждая задача представляет собой элементарную операцию над набором векторов данных. Например, если task_A
определено в модели как операция над "x"(double), "y"(double), "scale"(int)
, то мы фактически пытаемся эмулировать выполнение task_A(double x[i], double y[i], int scale[i])
для всех значений i
.
Каждая задача (функция) работает с разными подмножествами данных, поэтому эти функции имеют общую сигнатуру функции и имеют доступ к данным только через определенные API, например. get_int("scale")
и set_double("x", 0.2)
.
В предыдущем воплощении фреймворка (написанном на C) задачи планировались статически, а фреймворк генерировал код на основе заданной модели для запуска симуляции. Порядок задач основан на графе зависимостей, извлеченном из определения модели.
Теперь мы пытаемся создать общую среду выполнения для всех моделей с планировщиком времени выполнения, который выполняет задачи по мере удовлетворения их зависимостей. Переход от создания кода, специфичного для модели, к общему коду привел к всевозможным проблемам. По сути, мне нужно иметь возможность обрабатывать гетерогенные векторы и получать к ним доступ по «имени» (и, возможно, type_info
), отсюда и вопрос выше.
Я открыт для предложений. Любое предложение.
boost::any
без множества неприятных прыжков через обручи, чтобы точно отслеживать, какой тип вектора хранится в каждом слоте, так что пришло время сделать шаг назад и снова взглянуть на всю проблему, потому что скорее всего, вы используете неправильный тип данных. На самом деле это обычно происходит всякий раз, когдаany
начинает казаться возможным. Он имеет свое место, но оно не большое. - person Matthew Walton   schedule 03.05.2012boost::any
, отсюда и крик о помощи, которым является этот вопрос. - person Shawn Chin   schedule 04.05.2012