О реализации operator-
для is_densevector
классов, я хочу:Rvalue ссылки шаблон вывод аргумента на операторах
g = -v;
вызова первой версию оператора (клон V будет отрицательным), а также:
g = -std::move(v);
g = -(v + v);
g = -std::vector<double>({1,2,3});
вызовите вторую версию оператора (сам вектор будет отрицательным - для производительности).
Уловка !std::is_reference<C>::value
, но я не уверен, что это правильно. Кажется, что он работает.
//! Return the negative of vector \p v.
template<typename C>
typename std::enable_if<is_densevector<C>::value, C>::type
operator-(const C &v) { return ....; }
//! Return the negative of vector \p v.
template<typename C>
typename std::enable_if<!std::is_reference<C>::value && is_densevector<C>::value, C>::type
&&operator-(C &&v) { ....; return std::move(v); }
http://ideone.com/4suqp4 Как это?? Не уверен, что делает 'is_densevector' – Brandon
Не совсем. black-boxed 'is_densevector :: value' истинно для обоих' C = std :: vector 'и' C = std :: array 'и больше. Также в вашем примере вы не используете параметр функции «magic» 'C && v' as. –
Chameleon
Что значит, что я не использую «магию» в качестве параметра функции? Он использует семантику перемещения во втором объявлении оператора. Единственная разница между подписью, которую я опубликовал, и теми, которые у вас есть, это то, что ваш шаблон. Проверьте ссылку выше и убедитесь, что она использует семантику перемещения, потому что назначенный вектор является временным. Добавьте оператор печати к оператору и посмотрите: http://ideone.com/4cOh1i – Brandon