簡體   English   中英

如何使用boost :: any_range加入多個boost范圍並從函數w / o返回結果

[英]How to join multiple boost ranges and return as a result from function w/o using boost::any_range

例:

SomeType bar::foo() const {
  SomeType retVal;
  for (auto i = 0u; i < 10; ++i) {
    retVal = boost::range::join(retVal, m_someDataContainer.equal_range(i));
  }
  return retVal;
}


為了簡單起見,可以說m_someDataContainer和bar類的定義如下:

typedef boost::multi_index_container<
    int, bmi::indexed_by<bmi::hashed_unique<bmi::tag<struct someTag>,
                                           bmi::identity<int>>>> Data;
class bar {
public:
  SomeType foo() const;

private:
  Data m_someDataContainer;
};

問題是:如何計算foo()的返回類型以及如何不使用boost :: any_range而加入這些范圍

EDIT1:看起來這是完全不可能的,對先前的聯接值調用in in in loop使結果類型成為嵌套類型的joind_range和joined_range的joind_range的嵌套類型,依此類推,我想這根本不可能輕易得出

由於您具有(或可以生成)一系列相同類型的范圍,因此您需要展平范圍 迭代范圍內使用Jesse Good's flatten from Itering

return flatten(boost::irange(0, 10)
    | boost::adaptors::transform(
        [this](int i){ return m_someDataContainer.equal_range(i); }));

不幸的是,我認為這可能會使迭代器懸而未決,因此您應該在此處調整flatten以將范圍復制到其返回值; 您可以通過多重繼承來做到這一點:

template<typename Cont> using FlatIteratorRange
    = boost::iterator_range<flattening_iterator<decltype(std::declval<Cont>().begin())>;

template<typename Cont>
struct FlatRange
    : private Cont
    , public FlatIteratorRange<Cont>
{
    explicit FlatRange(Cont const& c)
        : Cont(c)
        , FlatIteratorRange<Cont>(
            flat_iter(this->Cont::begin(), this->Cont::end()),
            flat_iter(this->Cont::end()));
    {}
}

template<typename Cont>
auto flatten(Cont const& c) -> FlatRange<Cont>
{
    return FlatRange<Cont>(c);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM