Конструктор объекта требует от пользователя аргументов 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;
}
Это правильный код. Это красота C ++ 11. Для дальнейших данных, пожалуйста, смотрите сообщение Дэйва Абрахамса. Хотите скорость? Передать по значению.
Других решений пока нет …