2012-07-16 163 views
5

我正在尝试编写一个函数,它将任何类型的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专业化,以及其他所有我能想到的语法变体,但我似乎无法找到一种方法来获得我正在寻找的东西对于。这是否可能,如果有的话,需要做些什么?

回答

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()返回常量T *因为数据是常量引用到std ::数组,所以,尽量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

+1

我从来没有想过要将int更改为size_t。一旦你这样做了,那么void *的常量就会变得更加明显。谢谢。它现在有效。 – 2012-07-16 14:27:15