You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为模板化聚合类型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;
}

核心实现说明

  1. 编译期分支逻辑:使用C++17的if constexpr特性,在编译阶段根据模板参数T和U的取值,自动生成对应维度的加法代码,完全避免运行时判断开销。
  2. 聚合类初始化:保留原Point类的聚合特性,直接用初始化列表{...}构造返回新实例,无需额外定义构造函数,适配1个或2个参数的场景。
  3. 严格同类型约束:运算符模板仅接受相同模板参数的Point对象,完全符合你“仅支持同类型Point运算”的需求。

内容的提问来源于stack exchange,提问作者Oodini

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 17:35:24