可能重复:
C++中的Nullable值
在C++中表示可空成员的最佳方法是什么?
在C#中,我们可以使用Nullable<T>类型.非常需要这样的数据类型,因为并非所有数据都具有有意义的价值.这是一个非常重要的数据类型,@ Jon Skeet花了整整一章,跨越了27页,仅Nullable<T>在他的优秀着作C#Depth中进行了描述.
一个简单的例子可以是一个Person类1,定义为:
struct Person
{
std::string Name;
DateTime Birth;
DateTime Death;
//...
};
Run Code Online (Sandbox Code Playgroud)
由于一个人总是有生日,所以Birth上述班级的成员总会有一些有意义的价值.但是怎么样Death?如果这个人还活着,它应该有什么价值呢?在C#中,此成员可以声明为Nullable<DataTime>2,null如果此人活着,则可以将其分配.
在C++中,解决这个问题的最佳方法是什么?截至目前,我只考虑了一个解决方案:将成员声明为指针:
DataTime *Death;
Run Code Online (Sandbox Code Playgroud)
现在它的价值可以是nullptr人活着的时候.但它强迫使用new死人,因为它会有一些有效的价值.它反过来意味着不能依赖编译器生成的默认复制语义代码.程序员必须编写复制构造函数,复制赋值,析构函数遵循三条规则(C++ 03),或者在C++ 11中规则,五条规则.
那么,除了制作指针之外,我们还有更好,更优雅的解决方案吗?
其他示例包括关系数据库表,因为在许多DBMS中,列可以为空.
这也有一个简写.人们可以写DataTime?这正是因为相同Nullable<DateTime>.
我正在使用本机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;
};
Run Code Online (Sandbox Code Playgroud)
这就是我必须定义函数的方法:
void StoredProc(int i, CNullableT<int> j)
{
...connect to database
...if j.IsNull pass null to database etc
}
Run Code Online (Sandbox Code Playgroud)
我称之为:
sp.StoredProc(1, 2);
Run Code Online (Sandbox Code Playgroud)
要么
sp.StoredProc(3, CNullValue::Null());
Run Code Online (Sandbox Code Playgroud)
我只是想知道是否有比这更好的方法.特别是我不喜欢CNullValue的单例类对象和静态.我更愿意这样做
sp.StoredProc(3, …Run Code Online (Sandbox Code Playgroud)