C ++中的可空值
收藏

我正在使用本机C ++创建数据库访问层,并且正在寻找支持NULL值的方法。这是我到目前为止的内容:

class CNullValue
{
public:
    static CNullValue Null()
    {
        static CNullValue nv;

        return nv;
    }
};

template<class T>
class CNullableT
{
public:
    CNullableT(CNullValue &v) : m_Value(T()), m_IsNull(true)
    {
    }

    CNullableT(T value) : m_Value(value), m_IsNull(false)
    {
    }

    bool IsNull()
    {
        return m_IsNull;
    }

    T GetValue()
    {
        return m_Value;
    }

private:
    T m_Value;
    bool m_IsNull;
};

这就是我必须定义函数的方式:

void StoredProc(int i, CNullableT<int> j)
{
    ...connect to database
    ...if j.IsNull pass null to database etc
}

我这样称呼它:

sp.StoredProc(1, 2);

要么

sp.StoredProc(3, CNullValue::Null());

我只是想知道是否有比这更好的方法。特别是我不喜欢带有静态变量的CNullValue的类单例对象。 我宁愿做

sp.StoredProc(3, CNullValue);

或类似的东西。别人如何解决这个问题?

最佳答案

Boost.Optional可能会满足您的需求。

boost::none takes the place of your CNullValue::Null(). Since it's a value rather than a member function call, you can do using boost::none; if you like, for brevity. It has a conversion to bool instead of IsNull, and operator* instead of GetValue, so you'd do:

void writeToDB(boost::optional<int> optional_int) {
    if (optional_int) {
        pass *optional_int to database;
    } else {
        pass null to database;
    }
}

但是,我认为您想出的基本上是相同的设计。

    公众号
    关注公众号订阅更多技术干货!