Инициализация 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

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