Пользовательский итератор не работает с BOOST_FOREACH?

У меня есть класс, содержащий некоторые данные, и я хотел бы добавить begin () и end () , которые предоставляют итераторы по идентификаторам данных.

Я использую Boost counting_iterator :

#include 
#include 
#include 
#include 

template   
class ContainerTpl {
 public:
  typedef std::size_t Id;
  typedef boost::counting_iterator const_iterator;
  ContainerTpl() {}
  const_iterator begin() {
    return boost::counting_iterator(0);
  }
  const_iterator end() {
    return boost::counting_iterator(container_.size());
  }
 private:
  std::vector container_;
};

int main () {
  typedef ContainerTpl Container;
  Container c;
  BOOST_FOREACH (Container::Id cid, c) {
    std::cerr << cid << std::endl;
  }
  return 0;
}

Обратите внимание, что это минимальный пример кода; в действительности класс содержит больше функциональных возможностей, так что, например, typedef to вектор будет недостаточно. Мне действительно нужен этот класс с итератором по идентификаторам.

К сожалению, приведенный выше код дает мне довольно неприятные ошибки компилятора:

In file included from boost/foreach.hpp:71,
                 from a.cpp:3:
boost/mpl/eval_if.hpp: In instantiation of ‘boost::mpl::eval_if, boost::range_const_iterator >, boost::range_mutable_iterator > >’:
boost/foreach.hpp:355:   instantiated from ‘boost::foreach_detail_::foreach_iterator, mpl_::bool_ >’
a.cpp:25:   instantiated from here
boost/mpl/eval_if.hpp:38: error: no type named ‘type’ in ‘struct boost::range_mutable_iterator >’
a.cpp: In function ‘int main()’:
a.cpp:25: error: no matching function for call to ‘begin(const boost::foreach_detail_::auto_any_base&, boost::foreach_detail_::type2type, mpl_::bool_ >*, boost::mpl::o\
r_ > >, mpl_::bool_, mpl_::bool_, mpl_::bool_, mpl_::bool_ >, boost::mpl::and_ > >, boost::foreach::is_lightweight_proxy >, mpl_::bool_, mpl_::bool_, mpl_::bool_ >, mpl_::bool_, m\
pl_::bool_, mpl_::bool_ >*)’
a.cpp:25: error: no matching function for call to ‘end(const boost::foreach_detail_::auto_any_base&, boost::foreach_detail_::type2type, mpl_::bool_ >*, boost::mpl::or_\
 > >, mpl_::bool_, mpl_::bool_, mpl_::bool_, mpl_::bool_ >, boost::mpl::and_ > >, boost::foreach::is_lightweight_proxy >, mpl_::bool_, mpl_::bool_, mpl_::bool_ >, mpl_::bool_, mpl\
_::bool_, mpl_::bool_ >*)’
a.cpp:25: error: no matching function for call to ‘deref(const boost::foreach_detail_::auto_any_base&, boost::foreach_detail_::type2type, mpl_::bool_ >*)’

Как я могу заставить код работать?

ОБНОВЛЕНИЕ: после ответа я добавляю следующий код, данные Succ n - ... Я видел различные фрагменты кода, которые создают ...

Предположим, я закодировал натуральные числа в типах Haskell и у меня есть способ их сложения и вычитания:

data Zero
data Succ n
-- ...

У меня есть видел различные фрагменты кода, которые создают видимость вариативных функций, таких как this , что позволяет следующее:

buildList "polyvariadic" "function" "wut?" :: [String]
-- ["polyvariadic","function","wut?"]

Что мне интересно, так это то, смогу ли я построить на основе этого функцию, которая будет только принять количество аргументов, которое соответствует экземпляру номера типа. То, что я пытаюсь сделать, будет выглядеть примерно так:

one = Succ Zero
two = Succ one
three = Succ two

threeStrings :: String -> String -> String -> [String]
threeStrings = buildList three

threeStrings "asdf" "asdf" "asdf"
-- => ["asdf","asdf","asdf"]

threeStrings "asdf"
-- type checker is all HOLY CHRIST TYPE ERROR

threeStrings "asdf" "asdf" "asdf" "asdf"
-- type checker is all SWEET JESUS WHAT YOU ARE DOING

Я понимаю, что это довольно глупо и, вероятно, это пустая трата моего времени, но мне показалось, что на выходных это будет весело.

14
задан porges 5 May 2011 в 02:15
поделиться