我正在使用 glm 数学库,它提供了许多 vectormatrix 结构和操作(用于图形)。它有许多不同的矢量大小的类型(vec2
, vec3
, vec4
等...),还有一个非常简洁的API来对它们进行一般的操作,而不管大小 (dot(a,b)
,length(a)
等...)。)
我想要的一个函数是确定一个向量的 "长度平方"(因为这样比较长度在计算上要便宜得多),本质上就是这个函数。float lengthSquared(v) { return glm::dot(v,v); }
我想创建一个这样的函数: 我如何去做?
这个函数的模板签名是 dot
是如下。
template <class T, glm::qualifier Q>
T dot(const glm::qua<T,Q> &x, const glm::qua<T,Q> &y)
所以我最好的尝试是这样的:
template <class T, glm::qualifier Q>
T lengthSquared(const glm::qua<T,Q> &x)
{ return glm::dot(x,x); }
但我得到很多错误,包括 'lengthSquared': no matching overloaded function found
(当用 vec2
),以及 [signature here]: could not deduce template argument for 'const glm::qua<T,Q> &' from 'glm::vec2'
.
我不太明白模板 "限定符 "是如何工作的,所以我在这里有点盲目。
谢谢!
编辑:这里是 vec2
: typedef glm::vec<2,float,glm::packed_highp> glm::vec2;
这里有一个样本 lengthSquared
: vec2 x = {0.5,0.5}; float ls = lengthSquared(x);
你的函数定义是。
template <class T, glm::qualifier Q>
T lengthSquared(const glm::qua<T,Q> &x)
{ return glm::dot(x,x); }
但你调用这个函数时的参数类型是: glm::vec<2,float,glm::packed_highp>
.
相反,你可以像这样写函数。
template <class T>
auto lengthSquared(const T &x)
{ return glm::dot(x,x); }
让编译器推断出参数类型和返回类型。
尽管看起来对你不起作用,我还是贴出了一个简单的C++20替代方案,它被当前版本的GCC和Clang所支持。
auto lengthSquared(const auto &v) { return glm::dot(v,v); }