如何加入多个提升范围和 return 作为函数 w/o 使用 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 和条 class 定义如下:
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() 的 return 类型以及如何在不使用 boost::any_range
的情况下加入这些范围
EDIT1:看起来这是不可能的,在先前连接的值上调用循环连接使结果类型成为 joined_range of joined_range of joined_range 的嵌套类型 ...等等,我想如果有的话,也不能轻易推断出来
由于您拥有(或可以生成)一系列相同类型的范围,因此您需要一个展平范围。使用来自 Iterating over a range of ranges:
的 Jesse Good 的 flatten
return flatten(boost::irange(0, 10)
| boost::adaptors::transform(
[this](int i){ return m_someDataContainer.equal_range(i); }));
不幸的是,我认为这可能会使迭代器悬空,因此您应该调整那里的 flatten
以将范围复制到它的 return 值中;你可以通过多重继承来做到这一点:
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);
}
示例:
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 和条 class 定义如下:
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() 的 return 类型以及如何在不使用 boost::any_range
的情况下加入这些范围EDIT1:看起来这是不可能的,在先前连接的值上调用循环连接使结果类型成为 joined_range of joined_range of joined_range 的嵌套类型 ...等等,我想如果有的话,也不能轻易推断出来
由于您拥有(或可以生成)一系列相同类型的范围,因此您需要一个展平范围。使用来自 Iterating over a range of ranges:
的 Jesse Good 的flatten
return flatten(boost::irange(0, 10)
| boost::adaptors::transform(
[this](int i){ return m_someDataContainer.equal_range(i); }));
不幸的是,我认为这可能会使迭代器悬空,因此您应该调整那里的 flatten
以将范围复制到它的 return 值中;你可以通过多重继承来做到这一点:
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);
}