У меня есть следующий код:decltype boost :: make_zip_iterator?
std::vector<PriceQuote, tbb::scalable_allocator<PriceQuote> > cBids(maxSize);
std::vector<PriceQuote, tbb::scalable_allocator<PriceQuote> > cAsks(maxSize);
auto zipBidsAsks = boost::make_zip_iterator(boost::make_tuple(cBids.begin(), cAsks.begin()));
Если бы я хотел decltype
возвращаемое значение, так что вместо того, чтобы хранить его в auto
я могу хранить его в decltype
из любых boost::make_zip_iterator
возвращается. Как выглядит этот код?
Я попытался:
typedef decltype(boost::make_zip_iterator(std::vector<PriceQuote>, std::vector<PriceQuote>)) zipper_type;
// type referred to by zipper_type::iterator
typedef std::iterator_traits<zipper_type::iterator>::value_type zipped_type;
zipped_type zipBidsAsks = boost::make_zip_iterator(boost::make_tuple(cBids.begin(), cAsks.begin()));
Но это даже близко не работать. Наконец, если я хочу перебрать zipBidsAsks
и получить каждый <0>
, <1>
. Как это делается?
код доступа теперь дает ошибку:
struct PriceBookEventData
{
timeval ts;
unsigned totalSize;
unsigned maxSize;
typedef decltype
(
boost::make_zip_iterator(boost::tuple<std::vector<PriceQuote>::iterator,
std::vector<PriceQuote>::iterator>())
) zipper_type;
zipper_type zipBidsAsks;
};
void AGUI::HandlePriceBookChange(const PriceBookEventData pbed)
{
int k = 0;
while(0 != stop--)
{
PriceQuote pqb = boost::get<0>(pbed.zipBidsAsks[k]);
PriceQuote pqa = boost::get<1>(pbed.zipBidsAsks[k]);
/data/cbworkspace/AGUI/AGUI.cpp|101|error: no matching function for call to ‘get(boost::detail::operator_brackets_result<boost::zip_iterator<boost::tuples::tuple<__gnu_cxx::__normal_iterator<PriceQuote*, std::vector<PriceQuote> >, __gnu_cxx::__normal_iterator<PriceQuote*, std::vector<PriceQuote> > > >, boost::tuples::cons<PriceQuote&, boost::tuples::cons<PriceQuote&, boost::tuples::null_type> >, boost::tuples::cons<PriceQuote&, boost::tuples::cons<PriceQuote&, boost::tuples::null_type> > >::type)’|
Спасибо, когда я использую свой код в моем коде [boost version 1.49], я получаю эту ошибку: /usr/local/include/boost/tuple/detail/tuple_basic.hpp|310|error: никакой подходящей функции для ca ll to '__gnu_cxx :: __ normal_iterator> :: __ normal_iterator (const stored_head_type &)' | –
user1676605
@ user1676605 Я не могу [воспроизвести] (http://coliru.stacked-crooked.com/view?id=53dbb532d4ea03627fbdfd41707e2dc4-f6dd968dbc09ccca850bc160d430b00a) ошибку. Но в моем примере я не использую векторный распределитель, отличный от стандартного. Возможно, ваша реализация libstdC++ не использует [страшные итераторы] (http://stackoverflow.com/questions/14391705/what-are-scary-iterators), поэтому вам нужно включить тип allocator также в выражение 'decltype'. Попробуйте заменить 'std :: vector :: iterator' с' std :: vector > :: iterator' –
Praetorian
Преториан, это была именно проблема. Добавление дополнительных работ tbb. Теперь у меня новая проблема, итерация по zip. – user1676605