C++ “函数的基本用法”;包括「;在Boost ICL中:是否未实现某些间隔类型和函数的组合?

C++ “函数的基本用法”;包括「;在Boost ICL中:是否未实现某些间隔类型和函数的组合?,c++,boost,boost-icl,C++,Boost,Boost Icl,我开始使用BoostICL,我偶然发现了一些非常基本的东西。例如,函数包含的应返回true或false,具体取决于给定元素是否在间隔内。但是,这适用于[右,左]\u打开\u间隔,但不适用于[打开,关闭]\u间隔(参见下面的示例) 这似乎太明显了,不能作为疏忽。我正在以预定的方式使用库? 例如(使用gcc 4.8或clang 3.3和Boost 1.54): #include//要使此MWE正常工作,boost icl应在内部包含它 #包括 #包括 #包括 int main(){ boost::i

我开始使用BoostICL,我偶然发现了一些非常基本的东西。例如,函数
包含的
应返回true或false,具体取决于给定元素是否在间隔内。但是,这适用于
[右,左]\u打开\u间隔
,但不适用于
[打开,关闭]\u间隔
(参见下面的示例)

这似乎太明显了,不能作为疏忽。我正在以预定的方式使用库?

例如(使用gcc 4.8或clang 3.3和Boost 1.54):

#include//要使此MWE正常工作,boost icl应在内部包含它
#包括
#包括
#包括
int main(){
boost::icl::右开放区间roi(6,7.);
断言(boost::icl::contains(roi,6.)==true);//确定
断言(boost::icl::contains(roi,6.)==false);//确定
boost::icl::关闭间隔oi(4,5.);//或打开间隔
断言(boost::icl::contains(oi,4.)==false);//错误:“已忽略候选模板”
断言(boost::icl::contains(oi,5.)==false);//错误:“已忽略候选模板”
}

注意:以上称为“静态”间隔(因为它们的绑定属性是类型的一部分)。动态间隔的工作与预期的一样。

我想这可以归结为浮点相等测试的相对无用性

您是否尝试过执行断言(0.1+0.2==0.3)

试试看。我会等的

如果您已经知道答案,那么很清楚为什么关闭的间隔不容易正确实现。背景资料:


另外,如果您有两个连续的闭合间隔
[a,b][b,c]
b
属于哪个区间?

在重新阅读Boost ICL的文档后,我在一个示例中发现了这个模糊的注释:“…您可能会使用一种静态间隔
right\u open\u建议使用间隔
。”。。。静态关闭、左_打开和打开间隔是为了完整性而实现的,但实际意义不大。“因此,目前我了解到,除了
右开门时间间隔
之外的任何东西都不能保证有效。我想我可以实现
contains
的重载,但如果我坚持使用
right\u open\u interval
以外的间隔,我可能会在将来发现另一个限制。这是有道理的,我想我是从
open\u interval
的角度考虑我的问题的,因为概念上的原因。但实际上,我不应该指望浮点值的不同类型的区间之间的差异,而应该回退到单个区间类型。尽管如此,我还是想说这个限制是令人惊讶的(尽管它本身就提出了你的观点)。我想在这一点上,我们正在猜测图书馆作者的意图。(在
[b.c]
中应该有一个逗号)此外,间隔的动态版本(上面描述的称为静态)也可以按预期工作(在浮点限制范围内),例如
包含(boost::icl::interval::open(1,5.),5.)==false
。我同意静态间隔的功能集似乎与动态间隔的功能集不对称。嗯,再多使用一点库,我意识到(至少对于连续变量而言)不需要将静态(-bounds)间隔与内部容器和动态(-bounds)间隔(甚至不需要转换)集成在一起。因此,在最后,静态间隔就像库中剩余的模糊角落。
#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"
}