我正在尝试编写一个函数,它将任何类型的STL数组作为其参数之一。写它的显而易见的方法是:
template<typename T, int count>
void setArrayBufferData(GLenum usage, const std::array<T, count>& data) {
setArrayBufferData(usage, data.data(), sizeof(T) * count);
}
这是另一个重载,它只是作为参考
void setArrayBufferData(GLenum usage, void* data, int size) {
glBufferData(GL_ARRAY_BUFFER, size, data, usage);
}
函数定义编译正常。但是,当我试着打电话时
std::array<int, 4> data;
setArrayBufferData(GL_STATIC_DRAW, data);
我得到一个“没有匹配函数来调用'setArrayBufferData'”错误消息。我知道如果我在调用中指定模板参数它会工作,但我希望调用推断它们。我已经尝试过研究模板模板参数,一个更通用的声明,然后是std :: array专门化,以及我能想到的所有其他语法变体,但我似乎无法找到一种方法来获得我正在寻找的东西对于。它是否可能,如果可能,需要做什么?
答案 0 :(得分:7)
template<typename T, int count>
void setArrayBufferData(GLenum usage, const std::array<T, count>& data)
不正确,因为std :: array是template<typename T, size_t N> struct array
。第二个参数必须是size_t
类型,而不是int
。
此外,data.data()返回const T *,因为数据是对std :: array的const引用,因此,尝试setArrayBufferData(GLenum usage, const void* data, int size)
或使用setArrayBufferData(usage, const_cast<T*>(data.data()), sizeof(T) * count);
#include <array>
void function(const void* ptr, size_t bytes)
{
}
template<typename T, size_t count>
void function(const std::array<T, count>& array)
{
function(array.data(), sizeof(T) * count);
}
int main()
{
std::array<int, 4> array;
function(array);
}
这个例子很好用。 http://liveworkspace.org/code/2a5af492e1f4229afdd0224171854d1c