如何在stl算法中使用glm的operator ==?

时间:2010-10-08 14:21:35

标签: opengl stl

是否可以在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 个答案:

答案 0 :(得分:2)

迟到了几年,但我想分享我的修复。 我需要一个比较器函数用于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中,并将其包含在

所需的比较器中
#include "util_glm.hpp"

我相信可以为glm :: ivec3

做一个类似的解决方案

答案 1 :(得分:1)

显然是open bug

答案 2 :(得分:0)

你可以在virtrev /目录中#include equal_operator.hpp。

答案 3 :(得分:0)

为了能够在glm::vec3中使用std::set<>,我在 type_vec3.inl 中实现了以下重载:

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相关性更小。更改代码以使任何其他轴更相关是非常简单的。

==运算符已经实现。