簡體   English   中英

在C ++中一般封裝結構中的“可選”字段的最佳方法是什么?

[英]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中。 由於生成了這些結構,因此優選通用方法。

我到目前為止的想法是:

  1. 指示字段是否已設置的字段位圖
  2. 使用sentinel值(對於std :: string為“\\ 0”,對於int為-1​​,對於float為-1.0f)
  3. 某種模板容器/代理封裝每個字段以指示它是否已設置,任何想法? 我認為這可能是最好的方法。

順便說一句,使用地圖或其他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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM