Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ c+的统一实现+'+';操作员使用'+=';操作人员_C++_Operators - Fatal编程技术网

C++ c+的统一实现+'+';操作员使用'+=';操作人员

C++ c+的统一实现+'+';操作员使用'+=';操作人员,c++,operators,C++,Operators,例如,我有两个结构:一个二维向量和一个定义了+=运算符的三维向量: struct Vector2 { double x; double y; .... Vector2& operator+=(const Vector2& vector); .... }; struct Vector3 { double x; double y; double z; .... Vector3& operator

例如,我有两个结构:一个二维向量和一个定义了+=运算符的三维向量:

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;
}
使用相应的“+=”运算符为这些结构实现“+”运算符非常简单:

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;
}
模板
T运算符+(常数T和向量1,常数T和向量2)
{
T结果(向量1);
结果+=向量2;
返回结果;
}
但是这个函数非常通用,它使得操作符+对于其他类来说不明确。 我尝试使用自定义类型特征和静态断言使此模板仅适用于Vector2和Vector3结构:

template <class T>
T operator+(const T& vector1, const T& vector2)
{
    static_assert(suitable_type_for_this_function<T>::value, "Unsupported type!");
    ...
}
模板
T运算符+(常数T和向量1,常数T和向量2)
{
静态断言(适用于此函数的类型::值,“不支持的类型!”);
...
}
但它并没有隐藏其他类的模板操作符声明。因此,这种方法再次导致歧义

如何实现这样一个统一运算符+,但仅为这两种特定类型定义它?

您可以应用,使用来约束
T
上允许的类型

template <class T>
std::enable_if_t<std::is_same_v<T, Vector2> || std::is_same_v<T, Vector3>, T>
operator+(const T& vector1, const T& vector2);
模板
std::如果启用,则启用
运算符+(常数T和向量1,常数T和向量2);
您可以应用,使用来约束
T
上允许的类型

template <class T>
std::enable_if_t<std::is_same_v<T, Vector2> || std::is_same_v<T, Vector3>, T>
operator+(const T& vector1, const T& vector2);
模板
std::如果启用,则启用
运算符+(常数T和向量1,常数T和向量2);
模板
结构使用增量添加{
使用Self=使用增量添加;
友元D运算符+(自和左、自常量和右){
lhs+=rhs;
返回std::move(lhs.self());
}
友元D运算符+(自常数和左、自常数和右){
返回D(lhs.self())+rhs;
}
私人:
D&self(){return*static_cast(this);}
D const&self()const{return*static_cast(this);}
};
现在就这样做:

struct Vector2:add_using_increment<Vector2>
struct Vector2:使用增量添加

当然,您可以使用SFINAE将模板参数限制为(A)是固定集之一,(B)在其上定义了
无效增量(lhs&,rhs const&)
函数,(C)在其上定义了
+=

(C) 他太贪婪了

您还可以使用它,它是my
的一个工业级版本,使用_increment

模板添加
结构使用增量添加{
使用Self=使用增量添加;
友元D运算符+(自和左、自常量和右){
lhs+=rhs;
返回std::move(lhs.self());
}
友元D运算符+(自常数和左、自常数和右){
返回D(lhs.self())+rhs;
}
私人:
D&self(){return*static_cast(this);}
D const&self()const{return*static_cast(this);}
};
现在就这样做:

struct Vector2:add_using_increment<Vector2>
struct Vector2:使用增量添加

当然,您可以使用SFINAE将模板参数限制为(A)是固定集之一,(B)在其上定义了
无效增量(lhs&,rhs const&)
函数,(C)在其上定义了
+=

(C) 他太贪婪了

您还可以使用my
的工业级版本,即使用增量添加