Сделайте мой Класс C++ повторяемым через BOOST_FOREACH

Надеюсь, это поможет.

Public Function query_print()
Dim db As Database
Dim qr As QueryDef

Set db = CurrentDb

For Each qr In db.QueryDefs
  TextOut (qr.Name)
  TextOut (qr.SQL)
  TextOut (String(100, "-"))
Next
End Function

Public Sub TextOut(OutputString As String)

    Dim fh As Long

    fh = FreeFile
    Open "c:\File.txt" For Append As fh
    Print #fh, OutputString
    Close fh

End Sub
11
задан newgre 20 October 2009 в 22:31
поделиться

3 ответа

Похоже, вам нужно написать свои собственные итераторы.

В библиотеке Boost.Iterator есть несколько полезных шаблонов. Я использовал их базовый класс Iterator Facade пару раз, и с его помощью легко и приятно определять собственные итераторы.

Но даже без него итераторы не являются ракетостроением. Им просто нужно предоставить правильные операторы и определения типов. В вашем случае они просто будут оболочкой для функции запроса, которую они должны вызывать при увеличении.

После того, как вы определили класс итератора, вам просто нужно добавить begin () и end () для вашего класса.

Похоже, основная идея состоит в том, чтобы вызвать функцию запроса при увеличении итератора, чтобы получить следующее значение. Затем при разыменовании должно возвращаться значение, полученное при последнем вызове запроса.

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

Например, предположим, что вам нужно вызвать query () , которая возвращает NULL, когда вы достигли конца последовательности, создать «конечный итератор» будет непросто. Но на самом деле все, что вам нужно, это определить равенство, чтобы «итераторы были равны, если они оба хранят NULL в качестве своего кэшированного значения». Итак, инициализируйте "конечный" итератор значением NULL.

Это может помочь найти требуемую семантику для итераторов ввода или, если вы читаете документацию по Boost.Iterator, особенно для однопроходных итераторов. Вероятно, у вас не получится создать многопроходные итераторы. Поэтому посмотрите, какое именно поведение требуется для однопроходного итератора, и придерживайтесь его.

5
ответ дан 3 December 2019 в 11:36
поделиться

Если ваш тип коллекции представляет собой стандартный интерфейс контейнера, вам не нужно ничего делать, чтобы заставить BOOST_FOREACH работать с вашим типом. Другими словами, если у вашего типа есть итератор и const_iterator вложенные определения типов, а также begin () и end () функции-члены, BOOST_FOREACH уже знает, как перебирать ваш тип. Никаких дополнительных действий не требуется.

http://boost-sandbox.sourceforge.net/libs/foreach/doc/html/boost_foreach/exnding_boost_foreach.html

0
ответ дан 3 December 2019 в 11:36
поделиться

На странице документации Boost FOR_EACH:

BOOST_FOREACH выполняет итерацию по последовательностям. Но что именно квалифицируется как последовательность? Поскольку BOOST_FOREACH построен поверх Boost.Range, он автоматически поддерживает те типы, которые Boost.Range распознает как последовательности. В частности, BOOST_FOREACH работает с типами, которые удовлетворяют концепции однопроходного диапазона. Например, мы можем использовать BOOST_FOREACH с:

0
ответ дан 3 December 2019 в 11:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: