MDL中不使用异常的编程方法
2020-10-27 本文已影响0人
左图右码
C++中的异常使用起来很繁琐,编码上也很不优雅,甚至有大神说应该禁止在代码中使用异常。
使用boost::optional<>
传递无效值,可以不用在无效的时候抛出异常,直接返回无效值就可以,接收的时候只需要判断是否有效,就能发现是否存在异常。
在mdl中也存在这样的机制,在EC中,ECValue
就能判断是否包含有效的值,还有在头文件<GeomApi.h>
中定义了一个模版struct ValidatedValue
也可以包装特定的值,并能保存是否有效的状态,内容如下:
template<typename T>
struct ValidatedValue
{
private:
T m_value;
bool m_isValid;
public:
//! Default value, marked not valid.
ValidatedValue() : m_value(), m_isValid(false){}
//! Specified value, marked valid.
ValidatedValue(T const &value) : m_value(value), m_isValid(true){}
//! Specified value, with validity indicated by caller
ValidatedValue(T const &value, bool isValid) : m_value(value), m_isValid(isValid){}
//! explicty query for the "the value", without regard for the validity flag.
T const &Value() const { return m_value; }
T &Value() { return m_value; }
//! return the validity flag.
bool IsValid() const { return m_isValid; }
//! return the validity flag, copy value to parameter.
bool IsValid(T &value) const { value = m_value; return m_isValid; }
//! update the validit member
void SetIsValid (bool value){m_isValid = value;}
//! Implicity type conversion operator Returns "the value", without regard for the validity flag.
operator T (){ return m_value; }
};
MDL对常用的结构进行了定义:
typedef ValidatedValue <struct DVec3d> ValidatedDVec3d;
typedef ValidatedValue <struct DVec2d> ValidatedDVec2d;
typedef ValidatedValue <struct RotMatrix> ValidatedRotMatrix;
......
使用中,调用返回的值的IsValid()
的函数进行有效性判断:
CurveLocationDetail location{};
....
if (location.PointAndUnitTangent().IsValid())
{
//do something...
}
这和boost::optional
是相同的,稍有不同的是boost::optional
重载了bool
操作符,而不用调用特殊函数。