Я хочу создать несколько родственников std::fscanf()
(Я знаю, что это функция C). Итак, мой интерфейс что-то вроде этого:Как перебирать пакет вариативных шаблонов во время (псевдо?) Времени исполнения?
template <charT, char_traits, ...>
std::size_t ts_scanf(is, format, opening_bracket, closing_bracket, args)
я решил реализовать # версию C чтения с консоли, так как он требует программиста поддерживать только один последовательность (в арг часть), а не аргументы и формат.
Вот как C# версии работы:
"text blah blah blah {0} {1} {0}", arg1, arg2
Таким образом, делает вывод типов arg1, arg2, а затем читает текст в месте, где {N} стоит в соответствующий аргумент.
Алгоритм того, что я хочу сделать:
1.Find открывающая скобка
2.Try для разбора Int, скажем N
3.Если удалось, получить Nth параметр из пакета, прочитайте его, используя is>>get<N>args
.
4.Ел не удался, выполнить немые читать
5.Повторите от 1 до 4 до конца формата или пока поток не исчерпывает
Таким образом, при написании цикла я встретил проблему:
for (i = 0; i < length; i = format.find(i, opening_bracket))
я обнаружил, что мне нужно как-то расширить параметр пакета args
, что невозможно сделать во время выполнения (так как цикл выполнения). Единственное решение, которое я имею в виду, - это рекурсия: при открытии скобки, читайте ее, обрезайте строку формата и рекурсируйте с обрезанной строкой и остальной частью вариационного пакета.
Вопрос: Есть ли решение, в котором можно было бы расширить вариационный пакет в (псевдо) времени выполнения?
Что такое 'open_bracket' и' clos_bracket'? Зачем тебе это надо ? 'fscanf' не имеет ничего подобного AFAIK. Псевдокод о том, как вы хотите, чтобы он работал, проделал бы долгий путь, объясняя, чем вкладывать его в слова. – Arunmu
@Arunmu, спасибо, добавлено – Incomputable
Если вы хотите сделать это действительно эффективно, тогда вам нужно использовать шаблоны выражений, чтобы сделать это во время самого компиляции (сопоставление). Это можно сделать, используя 'boost :: proto', хотя я признаю, что это не для слабонервных :). Другое решение, которое я знаю, является чисто исполняемым, поскольку вы собираетесь разбирать скобки только во время выполнения. Это потребует хранения аргументов в контейнере времени выполнения. – Arunmu