我正在用本机 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);
or
sp.StoredProc(3, CNullValue::Null());
我只是想知道是否有比这更好的方法。特别是我不喜欢带有静态的 CNullValue 类似单例的对象。
我宁愿这样做
sp.StoredProc(3, CNullValue);
或类似的东西。其他人如何解决这个问题?
升压可选 http://www.boost.org/doc/libs/1_37_0/libs/optional/doc/html/index.html可能会满足您的需要。
boost::none
取代你的CNullValue::Null()
。由于它是一个值而不是成员函数调用,因此您可以这样做using boost::none;
如果你愿意的话,为了简洁起见。它有一个转换为bool
代替IsNull
, and operator*
代替GetValue
,所以你会这样做:
void writeToDB(boost::optional<int> optional_int) {
if (optional_int) {
pass *optional_int to database;
} else {
pass null to database;
}
}
但我认为,你们提出的设计本质上是相同的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)