Я пытаюсь использовать std::unordered_map<std::string, std::shared_ptr<CObject>>
(далее именуемый картой), чтобы иметь возможность использовать карту для вызова одних и тех же функций для разных объектов на основе их имени. Указатели функций на карте были бы одним из способов сделать это, но я подумал, что было бы чище сохранить сами объекты на карте.
Теперь объекты хранятся в shared_ptr
, поскольку они имеют зависимости от других применений (функции-члены автоматически вызываются перед вызовами функций и т. д.), а shared_ptr
выделяются с помощью функции, которая обертывает make_shared
, которая, помимо прочего, также сбрасывает его. as перехватывает и выдает исключения с добавленной релевантной информацией (вероятно, больше не нужно, но это довольно большая кодовая база, и она является частью стандарта кодирования). Эта функция выделяет заданные объекты, используя shared_ptr
в качестве ссылки, и возвращает значение void.
Что я хотел сделать, так это создать карту с сопоставлением ключей с объектами и вызвать функцию выделения для всех этих объектов. Но поскольку функция выделения не возвращает OutputIterator или что-то подобное, я не могу использовать std::inserter
.
Я не хочу этого делать, используя lvalues, например:
std::map<std::string, std::shared_ptr<CObject>> objectMap;
shared_ptr< CObject> object;
allocate< CObject>( object );
objectMap.insert( make_pair("FirstObject", object ) );
Единственный способ, который я придумал, - это вызвать функцию распределения для несуществующих значений на карте, поскольку map
автоматически создаст для меня объекты, если они не существуют. Нравиться:
std::map<std::string, std::shared_ptr<CObject>> objectMap;
allocate< CObject>( objectMap["FirstObject"] );
Любые другие идеи?
std::inserter
. Я не уследил за этим фрагментом - можете ли вы показать, что вы надеялись сделать, но не мог? Допустимо ли перебирать карту дважды, один раз для заполнения ее ключами и еще раз для заполнения указателей? Откуда берутся ключи? - person Jonathan Wakely   schedule 27.06.2013transform
предложение тоже должно быть применимо. - person Jonathan Wakely   schedule 27.06.2013