创建模板方法的最佳方式(对于单例类),它接收模板类作为参数
Best way to create a template method (for a singleton class) that receives a template class as argument
我有一个单例类,这是我的主要引擎。
由于我使用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;
}
相关文章:
- 在 C++ 中将非指定类型作为参数传递的最佳方法?
- 读取大文件(>2GB)(文本文件包含以太网数据)并通过不同参数随机访问数据的最佳方法是什么?
- 将移出参数的最佳做法
- 生成包含给定类型的 N 个参数的可变参数列表的最佳方法?
- 使用作为参数返回的指针的最佳做法是什么
- 最佳做法是在方法中传递参数
- 将不同类型的多种参数发送到处理方法的最佳方法.C
- 将对象数组作为参数传递的最佳方法是什么
- 在函数中使用 const 引用参数访问函数中成员的最佳实践 C++.
- 第一个进程保持运行而后续进程仅传递参数的最佳 IPC 方法是什么?
- 最佳实践C :多种方法的重用默认参数
- 处理 2+ 模板参数的最佳方法
- 在C 中传递多个函数参数的最佳实践
- 将结构分为函数参数列表的最佳方法
- std::shared_ptr语言 - 将共享指针作为参数传递的最佳做法
- 将函数作为参数传递的最佳方式
- 派生类方法的默认参数的最佳实践
- 返回转发引用参数 - 最佳做法
- 具有多个特征对象作为参数的函数的最佳实践
- Win32 DLL导出函数参数最佳实践