Переместить семантику для множества параметров конструктора

Конструктор объекта требует от пользователя аргументов twp. Требуется, чтобы параметры были разных типов, но можно предположить, что каждый тип реализует правильную семантику перемещения. (Фактическим примером является класс cubic_spline, который создается с использованием объектов с произвольным доступом [векторов] числовых данных, один для «х», другой для «у» или «f (х) ‘».)

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

Следующее работает как для VC ++ std :: vector (Dinkumware), так и для пользовательского контейнера, который я написал. Неужели это так просто? Я думаю, что приведенный ниже код, вероятно, правильный, но у меня есть сомнения. Мой вопрос просто «Это правильный код?» (А если нет, то как он может потерпеть неудачу и как его следует переписать? Ненужное копирование данных будет считаться неудачей.)

#include <vector>

template<class V1, class V2>
class spline {
public:

spline(V1 v1, V2 v2)  noexcept
: xv( std::move(v1))
, yv( std::move(v2))
{}

private:
V1 xv;
V2 yv;
};int main() {

using dv = std::vector<double>;
using fv = std::vector<float>;

fv xx { 1.f, 1.5f, 1.7f, 2.f};
dv yy { 1, -1, 1.2, 3};
spline<fv, dv> sp(xx, std::move(yy));
// xx is now unchanged, but yy is empty, its contents
// having been moved by sp.
return 0;
}

1

Решение

Это правильный код. Это красота C ++ 11. Для дальнейших данных, пожалуйста, смотрите сообщение Дэйва Абрахамса. Хотите скорость? Передать по значению.

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector