izo*_*ica 8 c++ casting boolean operator-overloading
我已经看到SoF上的评论或答案,说明将强制转换操作符重载到bool是危险的,我宁愿选择void* operator.我仍然想问一下,在我的用例中使用这个运算符是否危险,如果是,为什么.
我实现了一个简单的几何库,其中一个最基本的类是我用以下方式定义的一个点:
struct point {
double x, y;
bool real;
point(double x_, double y_): x(x_), y(y_), real(true) {}
point(): x(0), y(0), real(true) {}
operator bool() {
return real;
}
};
Run Code Online (Sandbox Code Playgroud)
我将尝试解释为什么我需要使用强制转换操作符来布尔.我有另一个名为line的类,我有一个声明如下的函数:
point intersect(const line& a, const line& b);
Run Code Online (Sandbox Code Playgroud)
现在已经重载转换运算符为bool点我可以写两者:point p = intersect(a,b);和if (intersect(a,b))因此得到任一的两条线的交叉点或检查,如果两条线相交.我也在其他地方使用它,但我相信这个例子足以显示强制转换运算符的用法.我对演员操作员的使用是否危险,如果是,你可以举一个例子,当效果不符合预期时?
编辑:由于juanchopanza的一个小小的补充:在这个项目中我只能使用c ++ 11,所以我无法使运算符显式化.
这还不够好.既然你坚持使用C++ 03,那么如果你需要这样的东西就应该使用safe-bool习语(否则,explicit首选转换函数).
另一种解决方案是返回boost:optional:
boost::optional<point> intersect(const line& a, const line& b);
Run Code Online (Sandbox Code Playgroud)
我会采用这种方法(即使在C++ 11中),因为它在语义上看起来更好 - 并行线没有交叉点,因此返回值确实应该是可选的(或者可能是值).
| 归档时间: |
|
| 查看次数: |
1532 次 |
| 最近记录: |