【发布时间】:2014-03-20 17:11:51
【问题描述】:
我开始使用 Boost ICL,偶然发现了一些非常基本的东西。例如,函数contains 应该返回真或假,具体取决于给定元素是否在区间内。但是,这适用于[right,left]_open_intervals,但不适用于[open,closed]_inteval(参见下面的示例)。
这似乎太明显了,不可能是疏忽。我正在以预期的方式使用库?
例如(使用 gcc 4.8 或 clang 3.3 和 Boost 1.54):
#include <boost/concept_check.hpp> //needed to make this MWE work, boost icl should include it internally
#include<boost/icl/right_open_interval.hpp>
#include<boost/icl/closed_interval.hpp>
#include<boost/icl/open_interval.hpp>
int main(){
boost::icl::right_open_interval<double> roi(6.,7.);
assert(boost::icl::contains(roi, 6.) == true); //ok
assert(boost::icl::contains(roi, 6.) == false); //ok
boost::icl::closed_interval<double> oi(4.,5.); // or open_interval
assert(boost::icl::contains( oi, 4.) == false); //error: "candidate template ignored"
assert(boost::icl::contains( oi, 5.) == false); //error: "candidate template ignored"
}
注意:以上称为“静态”间隔(因为它们的绑定属性是类型的一部分)。动态间隔按预期工作。
【问题讨论】:
-
在重读了Boost ICL的文档后,我在一个例子中发现了这个晦涩的评论:“...您可能会使用一种静态间隔
right_open_intervals推荐。...静态关闭, left_open 和 open 间隔是为了完整性而实施的,但实际上并不重要。”所以目前我知道除了right_open_interval以外的任何东西都不能保证有效。我想我可以实现contains的重载,但如果我坚持使用right_open_interval以外的间隔,我将来可能会发现另一个限制。