c++ - 与 BOOST Range 的接口
问题描述
动机与方法
我正在编写一个小型库,它提供了一个 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 算法那样将任何范围类型转换为某种通用类型(我猜)?
提前致谢!
解决方案
any_range
(在 Boost.Range 库中)将允许您隐藏同一类型的不同范围之间的差异。
然而,这种信息隐藏是有代价的:每次增量和间接调用都需要一个虚函数调用(或类似的),这不仅本身很昂贵,而且对优化器来说也是一个障碍。评估返回类型的一致性是否能证明这一成本是一个好主意。
推荐阅读
- python - Wrapper Ktrain for Text Classification Multiclass - 与 CPU 并行化拟合
- javascript - Django 按钮在点击时加载更多帖子
- java - JavaFX在for循环中将节点添加到锚窗格,但每次迭代等待几秒钟,然后再添加下一个节点
- php - PHP按键排序多维数组
- javascript - 如何在AngularJs模型文本框中动态附加前缀值
- java - 使用 viewpager 时阻止屏幕特定部分的触摸事件
- go - 如果 goroutine 正在运行,则停止它
- javascript - jquery如何一次只有1个活动切换?
- hover - 不同类的悬停效果更少
- mysql - Mysql - 基于多个选择和位置检索数据的最有效方法