2012-07-16 13 views
5

Actualmente estoy intentando escribir una función que toma una matriz STL de cualquier tipo como uno de sus parámetros. La manera obvia de hacerlo es:Deducir los parámetros de la plantilla de función de los tipos de argumento de plantilla

template<typename T, int count> 
void setArrayBufferData(GLenum usage, const std::array<T, count>& data) { 
    setArrayBufferData(usage, data.data(), sizeof(T) * count); 
} 

Y aquí está la otra sobrecarga que llama sólo para referencia

void setArrayBufferData(GLenum usage, void* data, int size) { 
    glBufferData(GL_ARRAY_BUFFER, size, data, usage); 
} 

la definición de la función compila bien. Sin embargo, cuando intento llamarlo

std::array<int, 4> data; 
setArrayBufferData(GL_STATIC_DRAW, data); 

consigo un "sin función coincidente para la llamada a 'setArrayBufferData'" mensaje de error. Sé que si especifiqué los parámetros de la plantilla en la llamada funcionaría, pero quiero que la llamada los deduzca. Intenté investigar los parámetros de plantilla de plantilla, una declaración más genérica seguida de una especialización std :: array y cualquier otra variación sintáctica en la que pudiera pensar, pero parece que no puedo encontrar una manera de obtener lo que estoy buscando. para. ¿Es posible, y si es así, qué hay que hacer?

Respuesta

7
template<typename T, int count> 
void setArrayBufferData(GLenum usage, const std::array<T, count>& data) 

es incorrecto, ya que std :: array es template<typename T, size_t N> struct array. El segundo parámetro debe ser del tipo size_t, no int.

Además, data.data() devuelve const T * ya que los datos se hace referencia const std :: matriz, así, tratar de setArrayBufferData(GLenum usage, const void* data, int size) o llaman con 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); 
} 

este ejemplo funciona bien. http://liveworkspace.org/code/2a5af492e1f4229afdd0224171854d1c

+1

Nunca pensé en cambiar el int a size_t. Una vez que haces eso, entonces la constness de vacío * se vuelve más obvia. Gracias. Ahora funciona. –

Cuestiones relacionadas