длинный std::initializer_list с множеством элементов для тестирования

Мой класс должен наложить верхний предел на количество элементов одного из его элементов данных, который является контейнером.

Один из конструкторов моего класса принимает std::initializer_list в качестве параметра для инициализации этого члена данных контейнера.

Модульный тест должен проверить, что верхний предел установлен. Для этого мне нужно попытаться вызвать мой конструктор со списком инициализаторов из 1025 элементов.

Есть ли лучший (= более читаемый) способ создать этот список initializer_list из 1025 элементов, чем список литералов из 1025 элементов в скобках в тестовом коде?

(Тип данных элементов всегда беззнаковый короткий (uint16_t), мой класс не является шаблоном.)


person Ludwig Schulze    schedule 19.04.2017    source источник
comment
Вы можете сделать класс шаблоном с максимальным количеством элементов в качестве единственного параметра шаблона (по умолчанию 1024), но протестировать меньшие числа (скажем, 4), когда все, что вам нужно, это std::initializer_list из 5 элементов, а не 1025.   -  person Walter    schedule 19.04.2017
comment
Интересный. У меня есть немного нехорошее предчувствие, потому что тогда, строго говоря, я бы проверил поведение другого класса (или экземпляра шаблона), а не класса, который я фактически использую в производстве. Но что-то рассмотреть.   -  person Ludwig Schulze    schedule 19.04.2017
comment
вы можете использовать спецификацию шаблона для генерации 1024 элементов во время компиляции.   -  person Tomaz Canabrava    schedule 19.04.2017
comment
@TomazCanabrava Если вы знаете, как это делается, и это более читабельно, чем длинный буквальный список, опубликуйте его как ответ.   -  person Ludwig Schulze    schedule 19.04.2017
comment
Имеют ли эти числа какое-то значение или они могут генерироваться случайным образом?   -  person KjMag    schedule 19.04.2017
comment
@KjMag Для этого модульного теста важно только количество элементов, а не их значения. Они могут быть все 0, или случайные, или естественная последовательность, или что-то еще, для теста это не имеет значения. Конечно, если мне придется довольствоваться литеральным списком, то для лучшей (но все же плохой) читабельности я бы выбрал последовательность от 0 до 1024 или от 1 до 1025. Но я надеюсь, что кто-то из присутствующих сможет придумать что-то более короткое и читабельное. .   -  person Ludwig Schulze    schedule 19.04.2017
comment
Хорошо, и нормально ли, если список генерируется во время выполнения, или вам нужно что-то, что генерируется во время компиляции?   -  person KjMag    schedule 19.04.2017
comment
Все, что работает и читается, будет в порядке.   -  person Ludwig Schulze    schedule 19.04.2017
comment
А пока на этот вопрос ответили таким образом, что мне нечего добавить ;)   -  person KjMag    schedule 19.04.2017


Ответы (1)


Если вы выберете шаблонную рекурсию или причудливые «повторяющиеся» макросы, вы, возможно, столкнетесь с ограничениями статической рекурсии, что еще больше усложнит вашу реализацию, чем обычно.

Имея это в виду, я думаю, что самый простой и лучший подход - просто определить несколько вложенных макросов, т.е.

#define ZEROS_10 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
#define ZEROS_50 ZEROS_10, ZEROS_10, ZEROS_10, ZEROS_10, ZEROS_10
#define ZEROS_250 ZEROS_50, ZEROS_50, ZEROS_50, ZEROS_50, ZEROS_50
#define ZEROS_1K ZEROS_250, ZEROS_250, ZEROS_250, ZEROS_250

FooType f{ ZEROS_1K, ZEROS_10, ZEROS_10, 0, 0, 0, 0, 0 };
person Joseph Ireland    schedule 19.04.2017
comment
Выглядит неплохо. Простой, очень читаемый, достигает желаемого результата. Спасибо! - person Ludwig Schulze; 19.04.2017