Можно ли во время компиляции проверить длину списка инициализаторов в 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

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