У меня есть класс, содержащий некоторые данные, и я хотел бы добавить 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
Я понимаю, что это довольно глупо и, вероятно, это пустая трата моего времени, но мне показалось, что на выходных это будет весело.