3

次のコードがあります。

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戻り値を に格納する代わりに、戻り値の に格納できるようautodecltypeしたい場合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)’|
4

1 に答える 1

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;

zip イテレータの反復処理について、簡単な例を次に示します。

#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
于 2013-07-31T23:00:58.887 に答える