【发布时间】:2018-09-25 03:13:36
【问题描述】:
例如,我有 2 个结构:一个 2D 向量和一个定义了 += 运算符的 3D 向量:
struct Vector2
{
double x;
double y;
....
Vector2& operator+=(const Vector2& vector);
....
};
struct Vector3
{
double x;
double y;
double z;
....
Vector3& operator+=(const Vector3& vector);
....
};
使用相应的“+=”运算符为这些结构实现“+”运算符很简单:
Vector2 operator+(const Vector2& vector1, const Vector2& vector2)
{
Vector2 result(vector1);
result += vector2;
return result;
}
Vector3 operator+(const Vector3& vector1, const Vector3& vector2)
{
Vector3 result(vector1);
result += vector2;
return result;
}
我想把这两个函数统一起来,换成一个模板函数:
template <class T>
T operator+(const T& vector1, const T& vector2)
{
T result(vector1);
result += vector2;
return result;
}
但是这个函数太笼统了,以至于它使 operator+ 对于其他类变得模棱两可。 我尝试使用自定义类型特征和 static_assert 使此模板仅适用于 Vector2 和 Vector3 结构:
template <class T>
T operator+(const T& vector1, const T& vector2)
{
static_assert(suitable_type_for_this_function<T>::value, "Unsupported type!");
...
}
但它不会隐藏其他类的模板运算符的声明。因此,这种方法再次导致歧义。
我怎样才能实现这样一个统一的operator+,但只为这2个特定类型定义呢?
【问题讨论】: