Как инициировать константу std::array?

#include <array>
struct A
{
    A(char value, char another);
    const std::array<char, 42> something;  // how to init?
}

Рассматриваемые подходы:

  • a const_cast всегда опасен и часто UB
  • документы перечисляют единственный ctor как принимающий совокупный параметр - я хочу принять какой-то другой параметр и инициализировать константу
  • удаление константы ... нежелательно. Вся семантика такова: «Создай это, это никогда не нужно будет менять».
  • использование std::string беспокоит меня как неэффективное, и это встроенное устройство
  • std::experimental::make_array выглядит многообещающе, но пока не стандартно
  • список инициализации в ctor кажется многообещающим, но как?

Можно ли это сделать и как?

Не уверен, что не так с обычным способом, используя список инициализаторов. A(char value) : a{{value}} {}

john 05.04.2023 07:29

@john, это решает. Извините, что беспокою всех: мой мозг не существует.

Vorac 05.04.2023 07:33
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
3
54
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Используйте список инициализации членов конструктора A для инициализации массива, например:

A::A(char value) : arr{value} {}

ОБНОВЛЕНИЕ: вы отредактировали свой вопрос после того, как я опубликовал этот ответ.

В вашем исходном коде конструктор принимал один char, а array содержал 1 char, поэтому можно было полностью инициализировать array этим char.

Теперь в вашем новом коде конструктор занимает 2 char, но array содержит 42 char, поэтому единственный способ полностью инициализировать array любыми значениями, кроме нулей, требует использования вспомогательной функции, которая возвращает заполненный array, например:

std::array<char, 42> makeArr(char value) {
    std::array<char, 42> temp;
    temp.fill(value);
    return temp;
}

A::A(char value, char another) : arr{makeArr(value)} {}

Вот обман, покрывающий это: stackoverflow.com/a/14495926/12002570

Jason 05.04.2023 07:32

makeArr может быть constexpr (без изменений в C++20, замените fill на цикл for перед C++20)

Pepijn Kramer 05.04.2023 07:52

Другие вопросы по теме