«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Как элегантно инициализировать `std::array` с типами, не создаваемыми по умолчанию?

Как элегантно инициализировать `std::array` с типами, не создаваемыми по умолчанию?

Опубликовано 24 ноября 2024 г.
Просматривать:265

How to Elegantly Initialize a `std::array` with Non-Default-Constructible Types?

Элегантная инициализация std::array с конструируемым типом, отличным от умолчанию.

Инициализация std::array с нестандартным Тип конструктивного элемента может оказаться обременительной задачей. Повторение значения n раз вручную неэффективно и подвержено ошибкам при большом n.

Для решения этой проблемы существует более элегантный подход, заключающийся в использовании типа последовательности и генератора. Основная идея — создать последовательность индексов от 0 до n-1, а затем использовать функцию для многократного применения значения к каждому индексу.

Вот реализация:

template
auto repeat(T value, seq) -> std::array
{
  // Unpack N, repeating `value` sizeof...(N) times
  // Note that (X, value) evaluates to value
  return {(N, value)...};
}

Чтобы инициализировать std::array с использованием этого подхода:

template
void f(T value)
{
  // genseq_t is seq
  std::array items = repeat(value, genseq_t{});
}

Кроме того, используются следующие определения:

template
struct seq
{
  using type = seq;

  static const std::size_t size = sizeof ... (N);

  template
  struct push_back : seq {};
};

template
struct genseq : genseq::type::template push_back {};

template
struct genseq : seq {};

template
using genseq_t = typename genseq::type;

Это решение обеспечивает эффективный и элегантный способ инициализации std::array с типами, не создаваемыми по умолчанию, независимо от значения n.

Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3