Инициализация std::array с nullptr без параметров шаблонаC++

Программы на C++. Форум разработчиков
Anonymous
Инициализация std::array с nullptr без параметров шаблона

Сообщение Anonymous »

Я использую API, который ожидает непрерывный блок памяти, содержащий указатели.
Сами указатели могут иметь значение nullptr.
В настоящее время я использую C -Массивы:

Код: Выделить всё

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));
Моя цепочка инструментов содержит clang-tidy, который советует избегать массивов C и вместо этого предпочитать std::array.

Код: Выделить всё

std::array
имеет руководство по выводам, которое позволяет мне инициализировать такой массив следующим образом:

Код: Выделить всё

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
};
Это работает только в том случае, если первый элемент и все последующие элементы неявно преобразуются в один и тот же тип (указатель), в данном случае ID3D11ShaderResourceView*.
Он разваливается, как только первый элемент содержит 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::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
};
имеет смысл, поскольку первый элемент имеет тип std::nullptr_t.
Могу ли я инициализировать/вывести std:: array без явного указания типа и разрешить значение nullptr для первого элемента?
Я мог бы привести первый элемент (), но тогда я мог бы просто записать его и в этом типе.

Подробнее здесь: https://stackoverflow.com/questions/791 ... parameters

Вернуться в «C++»