[英]How to merge/concatenate multiple boost::container::small_vector 's and return the values as a boost::any_range?
[英]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.