C++ 最好的封装方式;“可选”;在C++;?

C++ 最好的封装方式;“可选”;在C++;?,c++,templates,struct,optional-variables,C++,Templates,Struct,Optional Variables,我有许多具体的结构,我想将字段指定为可选的(存在或不存在)。只是想知道人们有什么想法来实现这一点。下面是一个示例结构(字段也可以是其他结构,甚至是结构的向量): struct LogonMessage\t { Header\u t Header;//指向另一个包含所有原语的结构 std::字符串用户名; std::字符串密码; std::向量登录选项; int子账户; std::字符串文本; } 我希望默认所有字段都不显示,并逐个启用它们,可能是在它们的setter中。由于这些结构是生成的,因

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

struct LogonMessage\t
{
Header\u t Header;//指向另一个包含所有原语的结构
std::字符串用户名;
std::字符串密码;
std::向量登录选项;
int子账户;
std::字符串文本;
}
我希望默认所有字段都不显示,并逐个启用它们,可能是在它们的setter中。由于这些结构是生成的,因此最好使用通用方法

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

  • 指示是否设置字段的字段位图
  • 使用sentinel值(“\0”表示std::string,-1表示int,-1.0f表示float
  • 某种类型的模板容器/代理封装每个字段,以指示是否设置了字段,有什么想法吗?我认为这可能是最好的方法

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

    字符串和向量都有一个空的默认状态,可以使用
    if(username.empty())
    等来测试


    对于
    子帐户
    ,我猜0将是一个类似的空值。否则-1就可以了。

    听起来像是您想要的。

    保持简单。使用一个标志成员变量,您可以通过设置常量或将常量合并在一起,并通过对常量进行合并检查


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

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

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

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


    francesco

    对不起,我忘了提到我不能将boost用于这个特定的应用程序……不过,我会看看它的实现,或许会收集一些想法!
     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;
           }