创建模板方法的最佳方式(对于单例类),它接收模板类作为参数

Best way to create a template method (for a singleton class) that receives a template class as argument

本文关键字:参数 最佳 模板方法 方式 于单例 创建      更新时间:2023-10-16

我有一个单例类,这是我的主要引擎。

由于我使用D3D11,它使用相同的ID3D11Device方法来创建所有缓冲区(无论类型),我试图创建一个模板方法来创建缓冲区。

我也用std::数组

作为缓冲区的源

所以到目前为止我正在尝试的是:

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()>,因为它需要一个常量作为模板参数)。

有更好的方法来实现我想要的吗?或者我应该用不同的方法?谢谢。

编译器应该能够推断出大小和类型参数。

为什么你的引擎是单例的?这样做没有什么意义。你可以直接返回指针,而不是使用指向它的指针。一个原始的而不是资源管理指针?很高兴我不维护你的代码

我做了一个快速的测试用例,它似乎没有手动指定数组的大小。

这是代码:

#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;
}