Есть ли способ заполнить C ++ initializer_list a для l oop (или любым другим l oop)? - PullRequest
0 голосов
/ 30 марта 2020

Мне нужно создать интерактивный сеанс в C ++, где пользователь может протестировать класс, который я создал. Это включает в себя создание объектов этого класса с его различными конструкторами. Одним из них является конструктор коллекции, использующий initializer_list.

В моем коде я могу запустить:

MyClass example = {1, 2, 3, 4};

Теперь мне нужно найти способ использовать его во время интерактивного сеанса. Каким-то образом мне нужно заполнить {} вводом, предоставленным пользователем. Пользователь может передать до 100 аргументов в этом списке, так что мне, вероятно, понадобится какое-то al oop решение моей проблемы. Что-то вроде работы (извините за C ++ / Python смесь псевдокодов):

MyClass example = {a for a in user_input};

Знаете ли вы что-нибудь, что я могу использовать для решения этой проблемы?

Ответы [ 2 ]

2 голосов
/ 30 марта 2020

Исходные данные для std::initializer_list: всегда в скобках-init-list: {/*stuff*/}. Только эта грамматическая конструкция может обеспечить массив для этого типа.

initializer_list, как следует из названия, предназначен для инициализации чего-либо; это просто посредник. Если вам нужно l oop поверх какого-то созданного вручную списка элементов, для этого предназначены контейнеры.

0 голосов
/ 30 марта 2020

std::initializer_list имеет длину constexpr. Это означает, что его длина всегда известна во время компиляции. Пользовательский ввод не имеет этого свойства.

Поэтому он не подходит для хранения пользовательского ввода.

A std::vector имеет длительность времени некомпиляции. Попробуйте использовать его.

Пусть MyClass примет std::span или std::vector вместо или в дополнение к initializer_list. (std::span новее, чем ).

Затем передайте это. Есть несколько способов, которыми вы можете заполнить std::vector пользовательским вводом.

...