为模板化聚合类型Point实现加法运算符
为支持1/2维的Point类实现同类型加法运算符
针对你实现的基于模板特化的1/2维Point类,我们可以利用C++17的编译期分支特性,直接根据模板参数生成对应维度的加法逻辑,完美适配不同参数数量的构造需求。以下是完整的实现方案:
完整代码实现
#include <iostream> #include <type_traits> enum class Axis : uint8_t { XCoord, YCoord, NoCoord }; template <Axis T> struct PointMember; template<> struct PointMember<Axis::NoCoord> { }; template<> struct PointMember<Axis::XCoord> { int x; }; template<> struct PointMember<Axis::YCoord> { int y; }; // 仅实例化单个维度,或X+Y组合的二维Point template <Axis T, Axis U = Axis::NoCoord, typename Enable = void> struct Point; template <Axis T, Axis U> struct Point<T, U, std::enable_if_t<(static_cast<uint8_t>(T) < static_cast<uint8_t>(U))>> : PointMember<T>, PointMember<U> { }; using Point2D = Point<Axis::XCoord, Axis::YCoord>; // PointMember的加法实现 template <> PointMember<Axis::XCoord> operator+(const PointMember<Axis::XCoord>& lhs, const PointMember<Axis::XCoord>& rhs) { return {lhs.x + rhs.x}; } template <> PointMember<Axis::YCoord> operator+(const PointMember<Axis::YCoord>& lhs, const PointMember<Axis::YCoord>& rhs) { return {lhs.y + rhs.y}; } template <> PointMember<Axis::NoCoord> operator+(const PointMember<Axis::NoCoord>& lhs, const PointMember<Axis::NoCoord>& rhs) { return {}; } // Point类的同类型加法运算符 template <Axis T, Axis U> Point<T, U> operator+(const Point<T, U>& lhs, const Point<T, U>& rhs) { if constexpr (U == Axis::NoCoord) { // 处理一维Point(X或Y单维度) if constexpr (T == Axis::XCoord) { return {lhs.x + rhs.x}; } else if constexpr (T == Axis::YCoord) { return {lhs.y + rhs.y}; } } else { // 处理二维Point(X+Y组合) return {lhs.x + rhs.x, lhs.y + rhs.y}; } } int main() { Point<Axis::XCoord> x_point1 { 1 }; Point<Axis::XCoord> x_point2 { 2 }; auto x_sum = x_point1 + x_point2; std::cout << "X维度求和: " << x_sum.x << "\n"; // 输出3 Point<Axis::YCoord> y_point1 { 3 }; Point<Axis::YCoord> y_point2 { 4 }; auto y_sum = y_point1 + y_point2; std::cout << "Y维度求和: " << y_sum.y << "\n"; // 输出7 Point2D xy_point1 { 5, 6 }; Point2D xy_point2 { 7, 8 }; auto xy_sum = xy_point1 + xy_point2; std::cout << "二维Point求和: (" << xy_sum.x << ", " << xy_sum.y << ")\n"; // 输出(12,14) return 0; }
核心实现说明
- 编译期分支逻辑:使用C++17的
if constexpr特性,在编译阶段根据模板参数T和U的取值,自动生成对应维度的加法代码,完全避免运行时判断开销。 - 聚合类初始化:保留原Point类的聚合特性,直接用初始化列表
{...}构造返回新实例,无需额外定义构造函数,适配1个或2个参数的场景。 - 严格同类型约束:运算符模板仅接受相同模板参数的Point对象,完全符合你“仅支持同类型Point运算”的需求。
内容的提问来源于stack exchange,提问作者Oodini
相关产品推荐
相关产品推荐

