2

О реализации 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); } 
+0

http://ideone.com/4suqp4 Как это?? Не уверен, что делает 'is_densevector' – Brandon

+0

Не совсем. black-boxed 'is_densevector :: value' истинно для обоих' C = std :: vector 'и' C = std :: array 'и больше. Также в вашем примере вы не используете параметр функции «magic» 'C && v' as. – Chameleon

+0

Что значит, что я не использую «магию» в качестве параметра функции? Он использует семантику перемещения во втором объявлении оператора. Единственная разница между подписью, которую я опубликовал, и теми, которые у вас есть, это то, что ваш шаблон. Проверьте ссылку выше и убедитесь, что она использует семантику перемещения, потому что назначенный вектор является временным. Добавьте оператор печати к оператору и посмотрите: http://ideone.com/4cOh1i – Brandon

ответ

1

Что вы делаете правильно. Поскольку вы забыли задать реальный вопрос, я предполагаю, что вы хотите проверить, почему он работает/необходим? Это необходимо, потому что вычет привел бы const T& или T& для C&& во втором случае. С помощью ссылки свертывается ссылка rvalue-reference. Поскольку это теперь неоднозначно с первой перегрузкой, вам необходимо устранить его с помощью проверки на is_reference.

Обратите внимание, что это требуется только для полностью выведенного параметра. Другим вариантом было бы следующее, которая опирается на простое разрешение перегрузки и тот факт, что только значение типа вектора выводится, а не весь вектор типа:

//! Return the negative of vector \p v. 
template<typename C> 
typename std::enable_if< 
    is_densevector<std::vector<C>>::value, 
    std::vector<C> 
>::type 
operator-(const std::vector<C> &v) { return ....; } 

//! Return the negative of vector \p v. 
template<typename C> 
typename std::enable_if< 
    is_densevector<std::vector<C>>::value, 
    std::vector<C>&& 
>::type 
operator-(std::vector<C> &&v) { ....; return std::move(v); } 
Смежные вопросы