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中。由于这些结构是生成的,因此最好使用通用方法
到目前为止,我的想法是:
顺便说一句,使用映射或其他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;
}