Jam*_*son 2 c c++ type-conversion
我正在研究做最近邻查询的代码.有两个简单的想法可以作为用户查询搜索中数据的基础:
在我的代码中,Points被放入PointList,而PointList是一个容器,其工作是跟踪在搜索中找到的点.
现在我的PointList对象有一个构造函数:
PointList( unsigned int maxvals ); // #1
Run Code Online (Sandbox Code Playgroud)
我想添加的下两个构造函数是:
PointList( float maxdist ); // #2
PointList( unsigned int maxvals, float maxdist ); // #3
Run Code Online (Sandbox Code Playgroud)
我的问题是:我如何确保我的用户和C++编译器将为PointList生成正确的构造函数并区分构造函数1和2?我应该只实现#3并提供定义maxvals和maxdist的任意大值的常量吗?另一个替代方案可能是编写另一个轻量级对象系统来管理将Points添加到列表中的逻辑,但这对于这样一个简单的想法来说就像是有点过分.
我真的试图让我的用户透明,这些用户大多是在没有正规教育的情况下学习过C++的科学家.谢谢!
为什么不使用工厂方法而不是构造函数?工厂方法具有可自定义名称的优点.
static PointList createNearestValues(unsigned int maxvals) {}
static PointList createByDistance(float maxdist) {}
Run Code Online (Sandbox Code Playgroud)
整数类型的重载分辨率发生在两个类别上,可以非常粗略地概括为
int到int或unsigned int,这取决于是否int可存储源类型的所有的值.类似地,浮点类型的转换发生在两个类别上
float为double并且存在从整数到浮动或返回的转换.这被归类为转化,而不是促销.促销的排名优于转化,并且只需要促销,该情况将是首选.因此,您可以使用以下构造函数
PointList( int maxVals );
PointList( unsigned int maxVals );
PointList( long maxVals );
PointList( unsigned long maxVals );
PointList( double maxDist );
PointList( long double maxDist );
Run Code Online (Sandbox Code Playgroud)
对于任何整数类型,这应该选择第一组构造函数.对于任何浮点类型,这应该选择第二组构造函数.例如,如果你传递了一个,那么你原来的两个构造函数很容易导致float和之间的歧义.对于另一个,两个参数构造函数,如果需要,可以使用您的解决方案.unsigned intint
也就是说,我也会使用工厂函数,因为我认为决定参数含义的类型是非常脆弱的.大多数人都希望以下结果相等
PointList p(floor(1.5));
PointList u((int)1.5);
Run Code Online (Sandbox Code Playgroud)
但这会导致不同的事态.