5

私は現在、パラメータの1つとして任意のタイプの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の特殊化、および考えられる他のすべての構文上のバリエーションを調べてみましたが、探しているものを取得する方法がわからないようです。にとって。それも可能ですか?もしそうなら、何をする必要がありますか?

4

1 に答える 1

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。2 番目のパラメーターは、 ではなく のタイプsize_tでなければなりませんint

また、 data は std::array への const 参照であるため、 data.data() は const T* を返します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

于 2012-07-16T14:05:33.033 に答える