如何在带模板参数D、T的类构造函数中初始化glm::vec<D,T,glm::highp>成员
解决MyClass构造函数匹配glm::vec行为的问题
要让MyClass的构造函数在D=3时和glm::vec3行为一致、D=4时和glm::vec4行为一致,核心是让MyClass的构造函数兼容glm::vec的所有构造重载,同时完整传递参数。你需要用可变参数模板和完美转发来实现:
替换后的完整代码
#include <glm/glm.hpp> #include <utility> // 用于std::forward template <typename T, int D> class MyClass { public: // 第一处???替换为可变参数模板构造函数 template <typename... Args> MyClass(Args&&... args) // 第二处???替换为完美转发参数给myVec的构造 : myVec(std::forward<Args>(args)...) { /* Do stuff */ } private: glm::vec<D, T, glm::highp> myVec; };
为什么这么做
- 可变参数模板
template <typename... Args>可以接受任意数量、任意类型的参数,完全覆盖glm::vec的所有构造场景(比如单个值初始化、多分量初始化、从其他向量类型转换等)。 std::forward<Args>(args)...是完美转发,能保留参数的左值/右值属性,确保glm::vec的构造函数能接收到和原始输入完全一致的参数,保证行为和原生glm::vec3/glm::vec4完全对齐。
示例验证
比如这些用法都会和对应glm::vec的行为完全一致:
// 对应glm::vec3(1.0f)的初始化 MyClass<float, 3> vec3_single(1.0f); // 对应glm::vec4(1,2,3,4)的初始化 MyClass<int, 4> vec4_multi(1, 2, 3, 4); // 对应glm::vec3(glm::vec2(1,2), 3)的初始化 glm::vec2 temp(1,2); MyClass<float,3> vec3_from_vec2(temp, 3.0f);
内容的提问来源于stack exchange,提问作者HelloGoodbye
相关产品推荐
相关产品推荐

