[英]Best way to encapsulate “optional” fields within a struct generically in C++?
我有許多具體結構,我想將字段指定為可選(現在或不存在)。 只是想知道人們有什么想法來實現這一目標。 這是一個示例結構(字段也可以是其他結構,甚至是結構的向量):
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;
}
我想將所有字段默認為不存在並逐個啟用它們,也許是在它們的setter中。 由於生成了這些結構,因此優選通用方法。
我到目前為止的想法是:
順便說一句,使用地圖或其他STL容器來封裝字段在這里不起作用,它們需要是具體的結構。
把事情簡單化。 使用一個標志成員變量,您可以通過將常量設置在一起並通過它們進行檢查來設置它。
Sentinel值的問題是選擇那些不是合法字段值(現在和將來)的值。
string和vector都有一個空的默認狀態,你可以用if (username.empty())
等來測試它。
對於一個subaccountid
我會猜測0將是一個類似的空值。 否則-1可能沒問題。
我會用一面旗幟。 我可以建議你兩個方法,一個保持堆上的值,一個保持在堆棧上。
在第一個中你使用std :: pair,第一個字段是exists-flag。 第二種方法是通過boost :: shard_ptr,如果指針指向0,則該字段不存在。
在這兩種情況下,我的建議不是直接訪問Value中的元素,而是使用幾個函數。 const值和值()const {return}值和值(){return}
弗朗切斯科
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.