У меня есть коллекция (в настоящее время boost::ptr_vector
) объектов (давайте назовем это vec), которые нужно передать нескольким функторам. Я хочу, чтобы у всех функторов была ссылка / указатель на один и тот же vec, который по сути является кешем, чтобы у каждого функтора был одинаковый кеш данных. Есть три способа сделать это:
Проходя boost::ptr_vector<object>&
конструктору Functor
и имея boost::ptr_vector<object>&
член в классе Functor
Проходя boost::ptr_vector<object>*
к конструктору Functor и имея boost::ptr_vector<object>*
член в классе Functor
избегать использования boost::ptr_vector
и напрямую передать массив (object*
) конструктору
Я пытался использовать метод 3, но мне постоянно говорили, что я должен использовать вектор вместо необработанного указателя. Итак, я попробовал метод 2, но это добавило задержки моей программе из-за дополнительного уровня косвенности, добавленного указателем. В настоящее время я использую метод 1, однако мне может потребоваться переназначить кэш в течение времени жизни функтора (поскольку кэш данных может измениться), так что это может оказаться неподходящей альтернативой.
Что я не до конца понимаю. Я предполагаю, что где-то по пути копируется функтор (хотя все они хранятся в самом ptr_vector).
Является ли метод 3 лучшим для моего случая? метод 2 слишком медленный (задержка очень важна), а что касается метода 1, мне снова и снова советовали использовать векторы.
Любой совет высоко ценится
Ссылка в C ++ может быть только инициализирована (‘привязана’) к переменной.
После этого момента ссылка может не быть «пересаженным» обращаться к другой переменной) в течение его жизни.
Вот почему конструктор копирования по умолчанию может быть сгенерирован, но не оператор присваивания, так как для этого потребуется «изменить» ссылку.
Мой рекомендуемый подход здесь — использовать умный указатель вместо ссылки.
В этом случае:
std::shared_ptr<boost::ptr_vector<object> > m_coll;
казалось бы, хорошо подходит
Других решений пока нет …