我有一个依赖于一种类型的模板类(例如模板< typename T>类Vector).现在,我想重载算术运算符,以便:
>我可以将它们与使用两种不同类型实例化的Vector一起使用;
>结果以与模板实例类型相同的方式推导出来;
例:
Vector<float> fv = {1.5, 2.5};
Vector<int> iv = {1,2};
auto s1 = fv + iv; // s1 MUST be of type Vector<float> == {2.5, 4.5}
auto s2 = iv + fv; // s2 MUST be of type Vector<float> == {2.5, 4.5}
我认为,在实现矩阵,向量,多项式等的通用目的数学库中,这将是一个在可用性方面产生差异的特性.
我找到了三种用C 11获得这个结果的方法
> – >符号
template <typename T, typename U>
auto operator +(const Vector<T> &lhs, const Vector<U> &rhs)
-> Vector<decltype(lhs[0]+rhs[0])>
{
Vector<decltype(lhs[0]+rhs[0])> res(lhs);
res += rhs;
return res;
}
> declval
template <typename T, typename U>
Vector<decltype(std::declval<T>()+std::declval<U>())>
operator +(const Vector<T> &lhs, const Vector<U> &rhs)
{
Vector<decltype(lhs[0]+rhs[0])> res(lhs);
res += rhs;
return res;
}
> declval作为默认类型arg
template <typename T, typename U,
typename R = decltype(std::declval<T>()+std::declval<U>())>
Vector<R> operator +(const Vector<T> &lhs, const Vector<U> &rhs)
{
Vector<R> res(lhs);
res += rhs;
return res;
}
在您看来,实现此类功能的最佳方法是什么?
如果有更好的解决方案,我会很感激.
您是否认为这种“互通”操作符是一项有价值的功能?
谢谢和最诚挚的问候,
达维德
最佳答案 这些操作符是否是一个“好主意”取决于您的用例.但是如果你想实现它们,我建议你使用一个从std :: common_type派生的traits类来获得更多控制:
template<typename T, typename U>
struct VectorCommonType : std::common_type<T,U> {};
template<typename T, typename U>
using VectorCommonTypeT = Vector<typename VectorCommonType<T,U>::type>;
这样你(或类的用户)可以在需要时专门化它.像这样使用它:
template<typename T, typename U>
VectorCommonTypeT<T,U> operator+(const Vector<T> &lhs, const Vector<U> &rhs)
{
VectorCommonTypeT<T,U> res(lhs);
res += rhs;
return res;
}