我有一个单独的类,这是我的主引擎。
因为我使用D3D11,它使用相同的ID3D11Device方法来创建所有缓冲区(无论类型),我试图创建一个模板方法来创建缓冲区。
我用作缓冲区的源代码的是std :: array
所以我到目前为止尝试的是:
template <size_t Size, typename T>
void CreateBuffer(BufferType bufferType, const std::array <T, Size>& source, ID3D11Buffer** out) {
(...)
bd.BindFlags = bufferType;
bd.ByteWidth = sizeof(T) * source.size();
(...)
}
然后我就像使用它一样:
ID3D11Buffer* buffer = nullptr;
array <SimpleVertex, 10> data; //this is the source data, 10 simple vertices
D3DEngine::GetInstance().CreateBuffer <10> (D3DEngine::Vertex, data, &buffer);
这是有效的,但看起来很难看。 “10”作为参数模板迫使我“硬编码”大小(我甚至无法使用<data.size()>
,因为它需要一个常量作为模板参数)。
有没有更好的方法来实现我想要的?或者我应该使用不同的方法? 感谢。
答案 0 :(得分:1)
编译器应该能够推断出大小和类型参数。
为什么你的引擎是单身人士?没有什么意义。你可以只返回指针,而不是指向它。原始而不是资源管理指针?很高兴我不保留你的代码。
答案 1 :(得分:0)
我做了一个快速test-case,它似乎无需手动指定数组的大小。
这是代码:
#include <iostream>
#include <string>
#include <array>
template<size_t S, typename T> size_t CreateBuffer(std::string const & s, std::array<T, S> const & source)
{
// do something
return S;
}
int main(int argc, char ** argv)
{
std::array<std::string, 10> arr;
size_t ret = CreateBuffer("my string", arr);
std::cout<<"Size: "<<ret;
return 0;
}