当前位置: 首页 > 知识库问答 >
问题:

c++函数模板如何具体化?

韩豪
2024-01-09

我想具体化一个函数,我只有写好像不对

// 模板函数,用于给顶点赋值template <typename T1, typename T2>T2* VertexAssign(T1& M) {    // 创建一个新的T2对象    T2* v = new T2;    // 获取模型的顶点、法线和纹理坐标    std::vector<glm::vec3> Vertices = M.getVertices();    std::vector<glm::vec3> NormalVector = M.getNormals();    std::vector<glm::vec2> Texture = M.getTexCoords();    // 获取模型的索引和索引数量    v->Index = M.getIndices();    v->VertexCount = M.getNumIndices();    // 获取模型中的顶点数量    int loop = M.getNumVertices();    for (int i = 0; i < loop; i++) {        // 将每个顶点的x, y, z坐标赋值给Vertex类中的数组        v->Vertex.push_back(Vertices[i].x);        v->Vertex.push_back(Vertices[i].y);        v->Vertex.push_back(Vertices[i].z);        // 将每个法线的x, y, z坐标赋值给NormalVector类中的数组        v->NormalVector.push_back(NormalVector[i].x);        v->NormalVector.push_back(NormalVector[i].y);        v->NormalVector.push_back(NormalVector[i].z);        // 将每个纹理坐标的s, t坐标赋值给Texture类中的数组        v->Texture.push_back(Texture[i].s);        v->Texture.push_back(Texture[i].t);    }    return v;}template <>VertexClass* VertexAssign<ImportedModel, VertexClass>(ImportedModel& M) {    // 创建一个新的VertexClass对象    VertexClass* v = new VertexClass;    // 获取模型的顶点、法线和纹理坐标    std::vector<glm::vec3> Vertices = M.getVertices();    std::vector<glm::vec3> NormalVector = M.getNormals();    std::vector<glm::vec2> Texture = M.getTextureCoords();    // 获取模型中的顶点数量    int loop = M.getNumVertices();    v->VertexCount = loop;    for (int i = 0; i < loop; i++) {        // 将每个顶点的x, y, z坐标赋值给Vertex类中的数组        v->Vertex.push_back(Vertices[i].x);        v->Vertex.push_back(Vertices[i].y);        v->Vertex.push_back(Vertices[i].z);        // 将每个法线的x, y, z坐标赋值给NormalVector类中的数组        v->NormalVector.push_back(NormalVector[i].x);        v->NormalVector.push_back(NormalVector[i].y);        v->NormalVector.push_back(NormalVector[i].z);        // 将每个纹理坐标的s, t坐标赋值给Texture类中的数组        v->Texture.push_back(Texture[i].s);        v->Texture.push_back(Texture[i].t);    }    return v;}template <typename T1>VertexCutClass* VertexAssign<T1 , VertexCutClass>(T1& M) {    // 创建一个新的VertexCutClass对象    VertexCutClass* v = new VertexCutClass;    // 获取模型的顶点、法线和纹理坐标    std::vector<glm::vec3> Vertices = M.getVertices();    std::vector<glm::vec3> NormalVector = M.getNormals();    std::vector<glm::vec2> Texture = M.getTexCoords();    // 获取模型的索引和索引数量    v->Index = M.getIndices();    v->VertexCount = M.getNumIndices();    // 获取模型中的顶点数量    int loop = M.getNumVertices();    for (int i = 0; i < loop; i++) {        // 将每个顶点的x, y, z坐标赋值给Vertex类中的数组        v->Vertex.push_back(Vertices[i].x);        v->Vertex.push_back(Vertices[i].y);        v->Vertex.push_back(Vertices[i].z);        // 将每个法线的x, y, z坐标赋值给NormalVector类中的数组        v->NormalVector.push_back(NormalVector[i].x);        v->NormalVector.push_back(NormalVector[i].y);        v->NormalVector.push_back(NormalVector[i].z);        // 将每个纹理坐标的s, t坐标赋值给Texture类中的数组        v->Texture.push_back(Texture[i].s);        v->Texture.push_back(Texture[i].t);    }    return v;}

这样写好像不对

template <typename T1>VertexCutClass* VertexAssign<T1 , VertexCutClass>(T1& M)

1704790691659.png

共有2个答案

田成化
2024-01-09

函数不支持 partial specilization 。

可以直接重载:

template <typename T1>VertexCutClass* VertexAssign<T1>(T1& M) {    ...}
左丘昊天
2024-01-09

在C++中,函数模板的具体化(也称为特化)是允许你为特定的类型或类提供特殊的函数实现。在你的代码中,你试图为VertexAssign函数模板进行具体化,以处理ImportedModelVertexCutClass类型。

问题在于,你的具体化版本并没有正确地指定模板参数。在C++中,函数模板的具体化需要在函数名前添加template<>,并在参数列表中指定模板参数。

以下是正确的方法:

// 模板函数,用于给顶点赋值template <typename T1, typename T2>T2* VertexAssign(T1& M) {    // 创建一个新的T2对象    T2* v = new T2;    // 获取模型的顶点、法线和纹理坐标    std::vector<glm::vec3> Vertices = M.getVertices();    std::vector<glm::vec3> NormalVector = M.getNormals();    std::vector<glm::vec2> Texture = M.getTexCoords();    // 获取模型的索引和索引数量    v->Index = M.getIndices();    v->VertexCount = M.getNumIndices();    // 获取模型中的顶点数量    int loop = M.getNumVertices();    for (int i = 0; i < loop; i++) {        // 将每个顶点的x, y, z坐标赋值给Vertex类中的数组        v->Vertex.push_back(Vertices[i].x);        v->Vertex.push_back(Vertices[i].y);        v->Vertex.push_back(Vertices[i].z);        // 将每个法线的x, y, z坐标赋值给NormalVector类中的数组        v->NormalVector.push_back(NormalVector[i].x);        v->NormalVector.push_back(NormalVector[i].y);        v->NormalVector.push_back(NormalVector[i].z);        // 将每个纹理坐标的s, t坐标赋值给Texture类中的数组        v->Texture.push_back(Texture[i].s);        v->Texture.push_back(Texture[i].t);    }    return v;}// 针对ImportedModel的具体化版本template <>VertexClass* VertexAssign<ImportedModel, VertexClass>(ImportedModel& M) {    // 创建一个新的VertexClass对象    VertexClass* v = new VertexClass;    // 获取模型的顶点、法线和纹理坐标    std::vector<glm::vec3> Vertices = M.getVertices();    std::vector<glm::vec3> NormalVector = M.getNormals();    std::vector<glm::vec2> Texture = M.getTextureCoords();    // 获取模型中的顶点数量    int loop = M.getNumVertices();    v->VertexCount = loop;    for (int i = 0; i < loop; i++) {        // 将每个顶点的x, y, z坐标赋值给Vertex类中的数组        v->Vertex.push_back(Vertices[i].x);        v->Vertex.push_back(Vertices[i].y);        v->Vertex.push_back(Vertices[i].z);        // 将每个法线的x, y, z坐标赋值给NormalVector类中的数组        v->NormalVector.push_back(NormalVector[i].x);        v->NormalVector.push_back(NormalVector[i].y);        v->NormalVector.push_back(NormalVector[i].z);        // 将每个纹理坐标的s, t坐标赋值给Texture类中的数组        v->Texture.push_back(Texture[i].s);        v->Texture.push_back(Texture[i].t);    }    return v;}
 类似资料:
  • 在C++11之前,类模板和函数模板只能含有固定数量的模板参数。C++11增强了模板功能,允许模板定义中包含0到任意个模板参数,这就是可变参数模板。可变参数模板的加入使得C++11的功能变得更加强大,而由此也带来了许多神奇的用法。 可变参数模板 可变参数模板和普通模板的语义是一样的,只是写法上稍有区别,声明可变参数模板时需要在typename或class后面带上省略号...: template<ty

  • 我想用两种模板类型编写一个模板化函数:一种是bool,另一种是typename,我想专门研究typename。 这就是我想要的,但只针对T的几种类型: 没有bool在那里,我可以做这样的事情: 我搞不懂这句话的语法,而专门化方面的微软文档只涉及单一类型的情况。

  • 我正在尝试创建一个模板函子,它将使用任意数量的参数作为参数对象和成员函数。我不知道如何用模板正确地编写代码。 如果我使对象::方法没有参数-代码编译。但是有参数-没有。 严重性代码描述项目文件行抑制状态错误C2664'int Builder::运算符()(T

  • 在G++中如何做到这一点? 声明类模板ss。[确定] 取消静态函数模板f[ok] 如何专门化f?[错误] 这段代码对于VC++是可以的。 在线:https://godbolt.org/z/qgq6bp

  • 本文向大家介绍C++函数模板与类模板实例解析,包括了C++函数模板与类模板实例解析的使用技巧和注意事项,需要的朋友参考一下 本文针对C++函数模板与类模板进行了较为详尽的实例解析,有助于帮助读者加深对C++函数模板与类模板的理解。具体内容如下: 泛型编程(Generic Programming)是一种编程范式,通过将类型参数化来实现在同一份代码上操作多种数据类型,泛型是一般化并可重复使用的意思。泛

  • 是否允许在友元声明中为模板参数提供默认值? Visual Studio 2015似乎允许这样做。gcc拒绝了。我在cppreference页面上找不到任何内容。