【问题标题】:How to pass a templated vector to a C++ function?如何将模板化向量传递给 C++ 函数?
【发布时间】:2018-02-12 01:46:29
【问题描述】:

我正在编写一个函数,该函数需要处理传入其中的任何类型的向量,而不管向量的内部类型如何。

该函数接受向量,找到元素的大小,然后将数据传递给 GPU。

它看起来像:

void Object_3D::set_instance_data(Renderer* handler, vector<T> data)
{
    glBindVertexArray(VAO);

    glBindBuffer(GL_SHADER_STORAGE_BUFFER, (VBOs[3]));
    glBufferData(GL_SHADER_STORAGE_BUFFER, data.size()*sizeof(T), 
        data.data(), GL_DYNAMIC_COPY);

}

但是我无法编译这段代码。

【问题讨论】:

  • 我不是这里的专家,但也许可以尝试使用函数模板?

标签: c++ templates vector


【解决方案1】:

看起来你需要把它变成一个模板成员函数,按照这个一般顺序:

template <class T>
void Object_3D::set_instance_data(Renderer* handler, vector<T> const &data)
{
    glBindVertexArray(VAO);

    glBindBuffer(GL_SHADER_STORAGE_BUFFER, (VBOs[3]));
    glBufferData(GL_SHADER_STORAGE_BUFFER, data.size()*sizeof(T), 
        data.data(), GL_DYNAMIC_COPY);
}

当然,您必须将其声明为模板成员函数,而不仅仅是在没有声明的情况下定义它。另外:虽然还有其他方法可以实现这一点,但在使用模板时,在标题中包含定义(不仅仅是声明)通常是最简单的。

【讨论】:

  • F事实上,声明必须在标题中才能编译
  • @Makogan:您的意思是定义,而不是声明。是的,这是正确的(如果它在类定义之外,也应该标记为inline)。还有其他方法可以让它编译(和链接),但你是对的:这是值得在答案中提及的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-17
  • 1970-01-01
  • 1970-01-01
  • 2011-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多