Boost предлагает библиотеку с несколькими значениями для значений с плавающей запятой, которая является удивительной, но glm не позволяет ее умножать на вектор или матрицу или почти все, что не знает что это.Умножьте glm :: vec3 с boost multiprecision float
Поэтому код ниже делает не компиляция:
#include <boost/multiprecision/cpp_dec_float.hpp>
#include <glm/glm.hpp>
int main()
{
typedef boost::multiprecision::cpp_dec_float_50 mp_float;
float a = 0.1f;
mp_float b = 0.1f;
glm::vec3 foo(1.f,1.f,1.f);
glm::vec3 v1 = a * foo; // OK
glm::vec3 v2 = b * foo; // COMPILER ERROR
}
Есть ли способ, чтобы сделать эту работу без необходимости идти и писать класс обертки и оператор перегрузку функций-членов? (Я действительно очень хотел бы избежать этого)
Или, если кто-то знает другой способ умножения чисел glm и высокой точности, я был бы признателен.
Спасибо
Хорошее предложение! Да, я знаю, что вы можете это сделать, но я стараюсь избежать перегрузки оператора как дыры, так как мне придется перегружать почти всех операторов, а для vec3, vec4, mat3, mat4's..etc! Не то, что я хочу провести свое время. : P К сожалению, glm :: detail :: tvec3 не работает ни при умножении с другим номером, ни на int, либо на float или mp_float. Итак, строка: glm :: detail :: tvec3 v3 = a * foo; не будет компилироваться, даже если «foo» и «a» имеют тип mp_float. –
UPDATE: вы даже не можете определить тип glm :: detail :: tvec3 golf; –
А, так вы не можете. Похоже, вы ограничены типами тривиальных конструкторов копий. Я отредактировал эту часть из моего ответа. Другая вещь, о которой я могу думать, - это определение перегрузок в виде шаблонов, так что вам не нужно переопределять их для каждого типа вектора/матрицы: 'template T operator * (T v, mp_float f) {return v * f.convert_to (); } ' –
Mike