运算符的右值引用模板参数推导

时间:2014-01-20 01:22:00

标签: c++ templates c++11 operator-overloading rvalue-reference

关于operator-is_densevector的实现,我想要:

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); }

1 个答案:

答案 0 :(得分: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); }