5

我有许多具体结构,我想将字段指定为可选(存在或不存在)。只是想知道人们有什么想法来实现这一目标。这是一个示例结构(字段也可以是其他结构,甚至是结构的向量):

 struct LogonMessage_t
       {
          Header_t header; // this points to another struct containing all primitives
          std::string username;
          std::string password;
          std::vector<LogonOption_t> LogonOptions;
          int subaccountid;
          std::string Text;
       }

我想将所有字段默认为不存在并一一启用它们,也许在它们的设置器中。由于生成了这些结构,因此最好使用通用方法。

到目前为止,我的想法是:

  1. 指示字段是否已设置的字段位图
  2. 使用标记值("\0" 代表 std::string,-1 代表 int,-1.0f 代表 float
  3. 某种模板容器/代理封装每个字段以指示它是否已设置,有什么想法吗?我认为这可能是最好的方法。

顺便说一句,使用地图或其他 STL 容器来封装字段在这里不起作用,它们需要是具体的结构。

4

4 回答 4

6

听起来你想要boost可选的。

于 2011-03-21T14:38:47.573 回答
2

把事情简单化。使用一个标志成员变量,您可以通过对常量进行 or-ing 设置并通过 and-ing 对其进行检查。

哨兵值的问题是选择那些不是合法的字段值(现在和将来)。

于 2011-03-21T14:39:13.887 回答
0

string 和 vector 都有一个空的默认状态,您可以使用if (username.empty())etc进行测试。

对于 asubaccountid我猜想 0 将是一个类似的空值。否则-1可能没问题。

于 2011-03-21T14:38:18.070 回答
0

我会用一个标志。我可以向您推荐两种方法,一种将值保存在堆上,另一种保存在堆栈上。

首先,您使用 std::pair 并且第一个字段是存在标志。第二种方法是通过 boost::shard_ptr,如果指针指向 0,则该字段不存在。

在这两种情况下,我的建议是不要直接访问 Value 中的元素,而是使用几个函数。常量值和值()常量{返回}值和值(){返回}

弗朗切斯科

于 2011-03-21T14:52:53.170 回答