如何使用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:看起来这是完全不可能的,对上一个联接值调用join-in循环会使结果类型成为joined_range的嵌套类型。。。等等,我想如果
由于您有(或可以生成)一系列相同类型的范围,因此需要一个平坦化范围。使用中的Jesse Good的flatten
在一系列范围内迭代:
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);
}
相关文章:
- 我正在将一个 std::string 传递给一个 boost 函数,该函数对该类型进行常量引用,但该值发生了变化
- 如何将Boost ::函数对象与所有参数绑定
- 从boost ::函数中提取参数
- Boost绑定和Boost函数,将带有参数的函数存储在向量中,然后执行它们
- 如何获得返回自身的boost::函数(或其他通用函数包装器)
- Boost函数赋值引发异常
- 正在从带有参数的new_ptr的boost::lambda::bind中获取boost::函数
- boost::函数与函数指针
- boost::函数参数定义不起作用
- 将boost::函数克隆到指针中,并用该指针调用封装的函数
- 使用boost::函数绑定到重载方法
- 如何使用boost函数来转换参数类型
- Boost::函数绑定的成员函数无效
- boost::函数与函数模板
- 如何将两个独立的boost::bind()组合为一个boost::函数
- boost元组导致boost绑定/boost函数出现问题
- 为什么某些 Boost 函数不需要以命名空间为前缀
- 从函数指针创建boost::函数的跨平台方法
- 传递boost::函数,该函数接受一个模板实参作为默认为NULL的形参
- 对模板使用boost::函数