2013-07-31 2 views
3

У меня есть следующий код: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)’| 

ответ

3

я не уверен, почему вы хотите, чтобы выяснить тип использования decltype вместо auto, последний был разработан специально для случаев, подобных этому. Использование decltype вместо этого громоздко.

Вы были близки к тому, что вы пробовали, за исключением того, что вы дали boost::make_zip_iterator пару векторов, а не tuple векторных обмоторов.

Попробуйте вместо

typedef decltype(
    boost::make_zip_iterator(
    boost::tuple< 
     std::vector<PriceQuote>::iterator, 
     std::vector<PriceQuote>::iterator>() 
) 
) zipper_type; 

Как для итерации почтового итератора, вот простой пример:

#include <iostream> 
#include <boost/iterator/zip_iterator.hpp> 
#include <boost/tuple/tuple.hpp> 
#include <vector> 

int main() 
{ 
    std::vector<int> v1{1,2,3,4}, v2{10,20,30,40}; 

    std::for_each(
     boost::make_zip_iterator(boost::make_tuple(v1.begin(), v2.begin())), 
     boost::make_zip_iterator(boost::make_tuple(v1.end(), v2.end())), 
     [](boost::tuple<int, int> const& tup) { 
      std::cout 
       << boost::get<0>(tup) 
       << ", " 
       << boost::get<1>(tup) 
       << std::endl; 
     } 
    ); 
} 

Выход:

1, 10 
2, 20 
3, 30 
4, 40 
+0

Спасибо, когда я использую свой код в моем коде [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

+0

@ 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

+0

Преториан, это была именно проблема. Добавление дополнительных работ tbb. Теперь у меня новая проблема, итерация по zip. – user1676605

Смежные вопросы