gpt4 book ai didi

c++ - "types"点的强类型解决方案

转载 作者:行者123 更新时间:2023-11-30 01:42:02 24 4
gpt4 key购买 nike

我试图在两种“空间类型”中表示点:窗口空间和世界空间。我有一个二维 vector 类,它是原始数据。

在不重写我的 2d vector 类的情况下“强类型”这两个的最佳方法是什么?也就是说,我将不得不重写所有的 operator+= operator-、operator+ 等等。

我目前针对这两点的代码如下。我正在寻找“更好的解决方案”。我将更好的定义为强类型,并且能够编写如下代码:

pos += {0, -1};

无需为 WindowPosition 和 WorldPosition 编写一整套运算符。

我目前的解决方案:

struct WindowPosition
{
template<typename... Args>
WindowPosition(Args&&... args)
: m_coords(std::forward<Args>(args)...)
{}

operator math::v2&() { return m_coords; }
operator const math::v2&() const { return m_coords; };

math::v2 m_coords;
};


struct WorldPosition
{
template<typename... Args>
WorldPosition(Args&&... args)
: m_coords(std::forward<Args>(args)...)
{}

operator math::v2&() { return m_coords; }
operator const math::v2&() const { return m_coords; };

WindowPosition ToWindowPosition()
{
return globals::CAMERA->ToWindowRelative(m_coords);
}

math::v2 m_coords;
};

但这意味着我必须改为这样做:pos.m_coords += {0, -1};

是否有更好的方法来实现我上面描述的目标?还是有更惯用的解决方案?

****编辑:这就是我最终要做的。谢谢@jzwinck:

struct Window {};
struct World {};

template <typename Tag>
struct Position : math::v2
{
template<typename... Args>
Position(Args&&... args)
: math::v2(std::forward<Args>(args)...)
{}
};

typedef Position<Window> WindowPosition;
typedef Position<World> WorldPosition;

WindowPosition ToWindowPosition(const WorldPosition& pos)
{
return globals::CAMERA->ToWindowRelative(pos);
}

最佳答案

模板!

struct Window {};
struct World {};

template <typename Tag>
struct Position
{
template<typename... Args>
Position(Args&&... args)
: m_coords(std::forward<Args>(args)...)
{}

operator math::v2&() { return m_coords; }
operator const math::v2&() const { return m_coords; };

math::v2 m_coords;
};

typedef Position<Window> WindowPosition;
typedef Position<World> WorldPosition;

WindowPosition ToWindowPosition(const WorldPosition& pos)
{
return globals::CAMERA->ToWindowRelative(pos);
}

关于c++ - "types"点的强类型解决方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40253814/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com