[英]an alternative to the following case
我遇到了一個無法找到易於維護且易於閱讀的解決方案的問題。
我基本上是在寫一個“主狀態機”,我有一個節點,它接收來自其他3個從屬節點的枚舉,這些枚舉獨立地執行其操作並進入某個狀態並將其報告給主節點。
從站1輸出枚舉之一:
enum slave1 {
A,
B
}
從站2輸出枚舉之一:
enum slave2 {
1,
2
}
從站3輸出枚舉之一:
enum slave3 {
a,
b,
c
}
重要的是要注意,我對從屬節點的行為,結構和輸出沒有任何控制權
現在,基於收到的值,我的主節點具有以下邏輯
val_slave_1 = getSlave1Val();
val_slave_2 = getSlave2Val();
val_slave_3 = getSlave3Val();
switch(val_slave_1):
case A:
switch(val_slave_2):
case 1:
switch(val_slave_3):
case a: {do Z}
case b: {do Y}
case c: {do X}
case 2:
switch(val_slave_3):
case a: {do W}
case b: {do V}
case c: {do U}
case B:
switch(val_slave_2):
case 1:
switch(val_slave_3):
case a: {do T}
case b: {do S}
case c: {do R}
case 2:
switch(val_slave_3):
case a: {do Q}
case b: {do P}
case c: {do O}
此代碼的優點是-
此代碼的問題是-
我對大家的問題是,有沒有更好的方法可以做到這一點? 我讀過很多地方說多態性通常是解決switch語句的好方法,但是我試圖使我的代碼具有多態性,但似乎無法確定解決方案。 盡管很多人都給出了一些簡單的例子,例如車輛和貓,但我似乎無法將其應用於我的問題。
另一個重要說明:它可能很明顯,但我仍然會寫。 編寫switch case語句的順序無關緊要。為了保持理智,我將選擇以最大到最小枚舉的順序編寫它,以節省代碼行(我認為)
我找到的最接近該問題的線程是-
但是,有比維護枚舉字典映射到函數更好的方法嗎?
因為您的枚舉值很小,所以從枚舉組合到函數的映射可能只是一個數組。 當您具有3、4和7個值(分別為2、2和3位)時,可以使用單個字節索引到函數指針數組中。 像這樣:
using Handler = void (*)();
std::array<Handler, 128> handlers = { doA, doB, doB, doG, nullptr, ..., doFoo };
int v1 = slave1(); // 0-6
int v2 = slave2(); // 0-3
int v3 = slave3(); // 0-2
int index = (v2 << 5) | (v1 * 3 + v3);
handlers[index]();
如果枚舉值從0到n不連續,則可能必須將它們重新映射到該值。
您可能想提出一種巧妙的方法來填充數組,因為在某些更改可能需要一段時間后才能手動重新計算索引。 我現在可以想到的一種方法是constexpr
函數,該函數采用許多結構,每個結構均包含枚舉值和函數指針,並從中填充一個數組。 結構將計算索引,函數將僅從索引分配函數指針。 或類似的東西。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.