Как правильно копировать Boost-массивы в обратных вызовах ROS? - PullRequest
0 голосов
/ 20 января 2019

Я относительно новичок в C ++ (у меня есть опыт в C и встроенном C), некоторые концепции C ++ все еще трудно обернуть.

Я пытаюсь скопировать массив надстройки из обратного вызова ROS. Для тех, кто не знаком с ROS, обратный вызов в моей программе (узле) передает ссылку на объект из системы обмена сообщениями ROS.

Объявление обратного вызова: void callback(const boost::shared_ptr<std_msgs::uint8_t>&);

Допустим, у меня есть две ссылки, которые я хочу скопировать из обратного вызова: одну из bool foo и другую boost::array<uint8_t, 8UL> bar.

Теперь я могу скопировать тип bool:

bool x;

void callback(const boost::shared_ptr<std_msgs::uint8_t>& msg) {
    x = msg->foo;
}

Это отлично работает, копирует значение в другую переменную до разрушения объекта.

Теперь я совсем не знаком с Boost. Открытая конструкция / копирование / уничтожение массива Boost: (1011 * ссылка ):

template<typename U> array& operator=(const array<U, N>& other);

Effects:
std::copy(rhs.begin(),rhs.end(), begin())

Вот как я пытаюсь скопировать bar переменную:

boost::array<uint8_t, 8UL> y;

void callback(const boost::shared_ptr<std_msgs::uint8_t>& msg) {
    std::copy(msg->bar.begin(), msg->bar.end() + 8, y.begin());
}

Это снова работает нормально, однако это правильный способ сделать это? Насколько я знаю, std::copy функция использует итераторы, я не совсем понимаю, как это работает (и если это правильно). Я знаком с memcpy(), могу ли я использовать это вместо этого, и если да, какие будут преимущества?

РЕДАКТИРОВАТЬ: Кроме того, если я сделал что-то вроде этого:

boost::array<uint8_t, 8UL> y;

void callback(const boost::shared_ptr<std_msgs::uint8_t>& msg) {
    y = msg->bar;
}

Будет ли это скопировано или указано?

...