代码之家  ›  专栏  ›  技术社区  ›  fho

如何在STL算法中使用glm的操作符==

  •  4
  • fho  · 技术社区  · 14 年前

    是否可以在STL算法中使用glm::gtx::comparison中定义的运算符?

    具体来说,我有以下代码:

    std::vector<glm::ivec3> vecA, vecB;    // vectors with content
    bool result = std::equal(vecA.begin(), vecA.end(), vecB.begin());
    

    默认情况下,此操作失败,因为找不到operator==

    4 回复  |  直到 10 年前
        1
  •  1
  •   genpfault    14 年前

    那是一个 open bug 显然地。

        2
  •  2
  •   Kow    10 年前

    只晚了几年,但我想分享我的修复方法。 我需要一个std::map和std::set的比较器函数。

    经过一番修改,我找到了下面的代码的解决方案

    #ifndef __UTIL_GLM__
    #define __UTIL_GLM__
    #include "glm/vec2.hpp"
    namespace glm{
      template <typename T, precision P>
      bool operator<(const tvec2<T, P>& a,const tvec2<T, P>& b)
      {
        return (a.x < b.x || (a.x == b.x && a.y < b.y));
      }
    };
    #endif
    

    在头文件中使用util glm.hpp并将其包含在需要使用comparator的地方。

    #include "util_glm.hpp"
    

    我相信可以为glm::ivec3做一个类似的解决方案。

        3
  •  0
  •   Calvin1602    14 年前

    您可以在virtrev/目录中包含equal_operator.hpp。

        4
  •  0
  •   JasonMArcher TWE    10 年前

    能够使用 glm::vec3 在一个 std::set<> ,我在 类型VEC3.IL :

    template <typename T> 
        GLM_FUNC_QUALIFIER bool operator<
        (
            tvec3<T> const & v1, 
            tvec3<T> const & v2
        )
        {
            if(v1.x == v2.x && v1.y == v2.y && v1.z < v2.z) return true;
            if(v1.x == v2.x && v1.y < v2.y) return true;
            if(v1.x < v2.x) return true;
            return false;
        }
    

    不幸的是,我不知道如何在不更改GLM代码的情况下实现它。

    这个实现认为x轴比y轴更相关,y轴比z轴比y轴更相关。更改代码以使其他轴更相关是非常简单的。

    这个 == 运算符已实现。