Как использовать оператор GLM == в алгоритмах STL? - PullRequest
4 голосов
/ 08 октября 2010

Можно ли использовать операторы, определенные в glm :: gtx :: сравнение в алгоритмах stl?

В частности, у меня есть этот код:

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

Это по умолчанию не удается вызвать оператор== не может быть найден.

Ответы [ 4 ]

2 голосов
/ 22 января 2015

Только на несколько лет позже, но я хотел поделиться своим исправлением. Мне нужна была функция сравнения для 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 голос
/ 08 октября 2010

Это открытый баг , очевидно.

0 голосов
/ 05 ноября 2014

Чтобы использовать 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 относительно меньшей, чем. Очень просто изменить код, чтобы сделать любую другую ось более релевантной.

Оператор == уже реализован.

0 голосов
/ 12 октября 2010

Вы можете #include equal_operator.hpp в каталоге virtrev /.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...