Можно ли во время компиляции проверить длину списка инициализаторов в C++?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Можно ли во время компиляции проверить длину списка инициализаторов в C++?

Сообщение Anonymous »

Я работаю над библиотекой линейной алгебры на C++, и у меня есть структура, похожая на вектор, в которой хранится фиксированное количество элементов. Я реализовал конструктор, который принимает std::initializer_list для инициализации элементов, но я хотел бы убедиться, что длина списка соответствует ожидаемой длине во время компиляции, вместо того, чтобы делать это во время выполнения.
Вот конструктор, который у меня сейчас есть:

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

template 
vec::vec(std::initializer_list init_list) : data_v{std::make_unique()}
{
assert(init_list.size() == L);  // Runtime check
std::copy(init_list.begin(), init_list.end(), data_v->begin());
}
Как видите, в настоящее время я использую утверждение для проверки во время выполнения, чтобы убедиться, что количество элементов в списке соответствует L. Однако я хотел бы выполнить эту проверку во время компиляции, чтобы избежать накладных расходов во время выполнения и сделать код более эффективным и безопасным.
Мой вопрос:
Есть ли способ выполнить эту проверку длины в списке инициализаторов во время компиляции? Я рассматривал возможность использования static_assert, но не нашел способа сделать это с помощью std::initializer_list, поскольку его размер неизвестен во время компиляции.
Есть ли какой-нибудь метод или подход на C++, который позволил бы мне выполнить эту проверку во время компиляции?

Подробнее здесь: https://stackoverflow.com/questions/793 ... tializer-l
Ответить

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

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

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

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

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