我正在尝试为 Vector 类实现基本算术运算,并希望支持混合底层类型,同时防止发生缩小。
template <typename T1,typename T2>
Vector<T1> operator+( Vector<T1> lhs, const Vector<T2>& rhs, std::enable_if< ! is_narrowing_conversion<T2,T1>::value >::type* = nullptr )
{ return lhs += rhs; }
我想实现 is_narrowing_conversion 以便仅在类型不缩小时才允许转换。这里有些例子:
Vector<double> a = Vector<double>() + Vector<float>(); //OK
Vector<float> a = Vector<float> + Vector<double>; //Fails to find the operator+ function
最后,我想编写第二个模板 operator+ 函数,该函数将通过返回一个 Vector 来处理相反的情况。
我发现这篇文章有一个不完整的例子。但这还不够,因为他指出它不允许 uint8_t 到 uint64_t 转换。
我还发现了Daniel Krügler 关于修复 is_constructible 的论文。特别是在本文中,他提到使用列表初始化,它已经具有缩小语义,但我不确定如何将他提到的内容转换为可用于 SFINAE 模板推导的适当特征。