2012-07-16 207 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