c++ - 在 C++ 中表示 Nullable 成员的最佳方式?

标签 c++ nullable c++11

Possible Duplicate:
Nullable values in C++

在 C++ 中表示可空成员的最佳方式是什么?

在 C# 中,我们可以使用 Nullable<T>类型。非常需要这样的数据类型,因为并非所有事物都可以具有有意义的 值。它是如此重要的数据类型,@Jon Skeet花了整整一章,超过27页,仅描述Nullable<T>在他的杰出著作中C# in Depth .

一个简单的例子可以是 Person1,定义为:

struct Person
{
  std::string Name;
  DateTime    Birth;
  DateTime    Death;
  //...
};

作为一个人总是有生日,所以Birth上述类的成员总是有一些有意义的值。但是 Death 怎么样? ?如果这个人还活着,它的值(value)应该是多少?在 C# 中,该成员可以声明为 Nullable<DataTime> 2 可以用 null 赋值如果这个人还活着。

在 C++ 中,解决此问题的最佳方法是什么?到目前为止,我只有一个解决方案:将成员声明为 pointer:

 DataTime *Death;

现在它的值可以是nullptr当人活着的时候。但它强制使用 new对于死人,因为它会有一些有效的值(value)。这反过来意味着不能依赖编译器生成的默认复制语义代码。程序员必须在 rule of three 之后编写复制构造函数、复制赋值、析构函数。 (C++03),或在 C++11 中,rule of five .

那么对于这个问题,我们有什么更好、更优雅的解决方案,而不是仅仅将其设为指针


1.其他示例包括关系数据库表,因为在许多 DBMS 中,列可以为空。

2。这也有一个简写。可以写DataTime?Nullable<DateTime> 完全相同 .

最佳答案

您可以查看 Boost.Optional :

struct Person
{
  std::string               Name;
  DateTime                  Birth;
  boost::optional<DateTime> Death;
  //...
};
  • 你的 Death 一开始是“未初始化的”。
  • 然后您可以使用 = 为其分配一个值,例如 Death = myDateTime
  • Death.is_initialized()时,可以使用Death.get()
  • 使用 Death.reset() 再次取消初始化。

不过,对于这样的简单情况,通常认为只选择您自己的明显标记值(例如,“0000-00-00 00:00:00”的 DateTime)会更加一致.

关于c++ - 在 C++ 中表示 Nullable 成员的最佳方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7645578/

相关文章:

c++11 - C++ 中的双 & 符号。 (第一个声明在 func 参数上,第二个声明在变量之前)

c++ - 将浮点值的 std::vector 传递给函数会稍微改变值

c++ - 将局部变量分类为 C++11 之前的谓词

c++ - 'int' 使用 static_cast 转换为 'const int',但既不初始化也不具有 const 行为

C++ Boost - 序列化错误 - 将 ‘const B’ 作为 ‘this’ 参数传递会丢弃限定符

c++ - 在派生类声明中使用 "Public"?

kotlin - Realm :如何通过DynamicRealm判断字段是否可为空?

c++ - 从类 C++ 返回映射

javascript - 如何将可为空的 json 对象表示为单个字符串?

c# - "ulong == ulong?"评估为 "ulong == ulong"工作正常