C++ 2a

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操作符,而不用调用特殊函数。

上一篇下一篇

猜你喜欢

热点阅读