Estou usando uma API que espera um bloco contíguo de memória que contém ponteiros. Os próprios ponteiros podem ser nullptr
.
Atualmente, uso C-Arrays:
ID3D11ShaderResourceView* srvs[] = {
room_diffuse_srv.Get(),
lightmap_srv.Get(),
room_normal_srv.Get(),
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
input.ambient_occlusion,
reflection_srv.Get(),
reflection_extents_srv.Get(),
nullptr,
nullptr,
nullptr
};
ctx->VSSetShaderResources(0, UINT(std::size(srvs)), std::data(srvs));
Minha cadeia de ferramentas contém clang-tidy, que recomenda evitar matrizes C e preferir std::array
.
std::array
tem um guia de dedução que me permite inicializar uma matriz como esta:
std::array srvs = {
room_diffuse_srv.Get(),
lightmap_srv.Get(),
room_normal_srv.Get(),
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
input.ambient_occlusion,
reflection_srv.Get(),
reflection_extents_srv.Get(),
nullptr,
nullptr,
nullptr
};
Isso só funciona quando o primeiro elemento e todos os elementos seguintes são implicitamente conversíveis para o mesmo tipo (ponteiro), neste caso ID3D11ShaderResourceView*
.
Ele se desfaz assim que o primeiro elemento contém um nullptr:
std::array srvs = {
nullptr,
lightmap_srv.Get(), // error: "a value of type "ID3D11SamplerState *" cannot be used to initialize an entity of type "std::_Enforce_same<std::nullptr_t, std::nullptr_t, ID3D11SamplerState *, std::nullptr_t, std::nullptr_t, ID3D11SamplerState *>::type" (aka "std::nullptr_t")"
room_normal_srv.Get(),
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
input.ambient_occlusion,
reflection_srv.Get(),
reflection_extents_srv.Get(),
nullptr,
nullptr,
nullptr
};
faz sentido, porque o primeiro elemento tem o tipo std::nullptr_t
.
Posso inicializar/deduzir um std::array
sem especificar o tipo explicitamente e permitir que o primeiro elemento seja nullptr
? Eu poderia converter o primeiro nullptr
elemento ( ), mas então eu poderia apenas escrevê-lo no tipo também.
Acho que você precisará criar uma função auxiliar que possa deduzir o tipo para você:
Então podemos escrever:
Você pode usar
std::to_array
: