我使用类似这样的东西:
template <typename T>
const T* temp_ptr(const T&& x) { return &x; }
使用方式如下:
foo(temp_ptr(Key{}));
当处理某些传统API时,这非常有用。特别是DirectX 11经常通过const T*
来聚合参数结构体,并且在创建和传递它们时很方便。我认为这种习惯用法没有任何问题,不像一些评论者所说的那样。尽管如此,我更喜欢那些API采用const引用并以不同的方式处理可选参数。
以下是一个D3D11 API调用的示例,其中这非常有用:
vector<Vec3f> verts;
...
ID3D11BufferPtr vbuf;
d3dDevice->CreateBuffer(
temp_ptr(CD3D11_BUFFER_DESC{byteSize(verts), D3D11_BIND_VERTEX_BUFFER}),
temp_ptr(D3D11_SUBRESOURCE_DATA{data(verts)}), &vbuf);
要调用ID3D11Device::CreateBuffer()
来创建顶点缓冲区。
在大型项目中,我可能会编写许多D3D API调用的包装器,使它们更方便以现代C ++风格调用,但对于我想要最小化额外代码或依赖项的小型独立示例项目,我发现这非常有用。
我过去使用的另一个技巧是:
foo(std::data({Key{}}))
但我不特别推荐这样做,因为我认为意图并不明确,并且需要对初始化列表的工作原理有过多了解。如果您需要传递临时“数组”,一种变体是有用的:
d3dDeviceContext->ClearRenderTargetView(rendertarget, data({0.0f, 0.0f, 0.0f, 0.0f}))
对于像ID3D11DeviceContext::ClearRenderTargetView()
这样的API进行调用。
void foo(const Key &key){ foo(&key); }
如何? - nwpC++
标准? - alexeykuzmin0