C++ 如何使用boost::any_range连接多个boost范围并从函数w/o返回结果

C++ 如何使用boost::any_range连接多个boost范围并从函数w/o返回结果,c++,boost,boost-range,C++,Boost,Boost 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; } sometypebar::foo()常量{ 某些类型的复述; 用于(自动i=0u;i数据; 分类栏{ 公众: SomeT

示例:

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;
}
sometypebar::foo()常量{
某些类型的复述;
用于(自动i=0u;i<10;++i){
retVal=boost::range::join(retVal,m_someDataContainer.equal_range(i));
}
返回返回;
}

为了简单起见,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;
};
typedef boost::多索引容器<
int,bmi::索引>数据;
分类栏{
公众:
SomeType foo()常量;
私人:
数据m_someDataContainer;
};
问题是: 如何计算foo()的返回类型,以及如何在不使用boost::any_range的情况下加入这些范围

EDIT1:看起来这是不可能的,在前一个联接值上调用join in loop会使结果类型成为联接范围的嵌套类型联接范围的嵌套类型联接范围的嵌套类型。。。诸如此类,我想如果你有(或可以生成)一系列相同类型的范围,你需要一个展平范围,那么很难推断出这一点。使用Jesse Good的
展平

return flatten(boost::irange(0, 10)
    | boost::adaptors::transform(
        [this](int i){ return m_someDataContainer.equal_range(i); }));
不幸的是,我认为这可能会使迭代器悬而未决,因此您应该调整那里的
flant
,将范围复制到其返回值中;您可以通过多重继承来实现这一点:

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);
}
使用FlatIteratorRange的
模板
=boost::iterator_rangeCont::begin(),this->Cont::end(),
平坦(这->继续::结束());
{}
}
模板
自动展平(Cont const&c)->展平范围
{
返回范围(c);
}

在某种程度上-VS2012我不知道VS2012支持多少C++11,但是如果它有尾随返回类型和
auto
,那么您已经差不多准备好了。我应该如何声明retVal局部变量?
auto retVal=/*first boost::join call*/然后相应地调整循环。编辑Nevermind,您正在调用本身中使用
retVal
:/嗯,很难看的解决方案,但可能有效。编辑:你他妈的说得对,这就是问题所在,第一次给Join打电话听起来很有趣,明天会检查。我在跳,我在joined_系列使用中遗漏了一些基本的东西,有一个简单的解决方案。看来我错了。