You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在带模板参数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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 11:52:04