【问题标题】:Interface with BOOST Range与 BOOST Range 的接口
【发布时间】:2020-07-23 15:26:04
【问题描述】:

动机和方法

我正在编写一个小型库,它提供了一个 AST 结构和一些算法来导航它。 简单来说,AST 的结构如下:

struct ASTNode;
using tBranch = std::vector<ASTNode>;
struct ASTNode
{
   /* some data */
   tBranch childs;
};
struct AST
{
   std::vector<tBranch> root;   // All branches
};

我想将算法定义为:

using tRange = boost::some_range_type<const tBranch::type>;   // which range type should I use?
tRange filter_by_type(tRange range, const eNodeType& type);

因此,AST 分支和分支部分(在算法中)的主要表示形式包含在 boost::range-s 中。 因此,所有函数也都返回范围。


示例

我问的主要问题是转换问题。 这是我正在尝试做的简短示例:

using tVector     = std::vector<int>;
using tBoostRange = boost::iterator_range<const tVector::value_type*>;

tBoostRange make_range(tVector& v)
{
   return boost::make_iterator_range( &v[0], &v[v.size()] );
}

tBoostRange get_odd_range(tVector& v1, tVector& v2)
{
   auto r1 = make_range(v1);
   auto r2 = make_range(v2);
   auto r3 = boost::range::join(r1, r2);
   
   /*
    * This return causes to error:
    * error: no viable conversion from returned value of type
    * 'filtered_range<(lambda at prog.cc:22:43),
    * boost::range::joined_range<boost::iterator_range<const int *>,
    * boost::iterator_range<const int *> > >' to function return type
    * 'tBoostRange' (aka 'iterator_range<const int *>')
    */
   return r3 | boost::adaptors::filtered( [](const auto& i){ return i % 2 != 0; } );
}

int main()
{
   auto v1 = tVector{ 1, 2, 3 };
   auto v2 = tVector{ 4, 5, 6 };
   auto r  = get_odd_range(v1, v2);
   
   for( const auto& i : r )
   {
      std::cout << i << std::endl;
   }
}

问题

我应该在我的库中使用什么类型的 boost::ranges 以保持 所有功能的一致性。是否可以转换任何范围 像 boost::range 算法那样输入一些通用类型(我猜)?

提前致谢!

【问题讨论】:

    标签: c++ boost c++17 boost-range


    【解决方案1】:

    any_range(在 Boost.Range 库中)将允许您隐藏同一类型的不同范围之间的差异。

    然而,这种信息隐藏是有代价的:每次增量和间接调用都需要一个虚函数调用(或类似的),这不仅本身代价高昂,而且对优化器来说也是一个障碍。评估返回类型的一致性是否能证明这一成本是一个好主意。

    【讨论】:

    • 嗨@ecatmur,谢谢你的回答!我做了一些研究,正如我所见,它需要大约 3 次虚拟通话,我认为这不是一个好方法。目前,我仍在寻找决策,提升范围概念似乎很适合这里,但实施起来并不容易。
    猜你喜欢
    • 1970-01-01
    • 2011-09-15
    • 2012-10-22
    • 1970-01-01
    • 2015-12-29
    • 1970-01-01
    • 2015-08-08
    • 2017-01-06
    • 1970-01-01
    相关资源
    最近更新 更多