我如何用另一个模板函数(特别是glm::dot)来包装一个模板函数?

问题描述 投票:0回答:1

我正在使用 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);

c++ templates glm
1个回答
1
投票

你的函数定义是。

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); }

让编译器推断出参数类型和返回类型。


0
投票

尽管看起来对你不起作用,我还是贴出了一个简单的C++20替代方案,它被当前版本的GCC和Clang所支持。

auto lengthSquared(const auto &v) { return glm::dot(v,v); }
© www.soinside.com 2019 - 2024. All rights reserved.