簡體   English   中英

我將如何使用不同類的成員函數來處理函數查找表?

[英]How would I approach a function lookup-table with member functions of different classes?

我正在傳遞一個包含值的數組,我需要將這些值傳遞給一些對象來存儲它們。 數組是二維的形式

{{int ID, int iNewValue}, ...}

我不知道更新了哪些值或更新了多少值,但 ID 是唯一的且不會更改。 我被告知 ID <-> 值對一次,所以我可以使用大量的 switch 語句來檢查 ID 並將值傳遞給正確的對象和正確的 setter 函數。 我想我可以使它更高效和方便,並使用一個查找表,其中索引是 ID,元素是指向正確成員函數的指針:

for (int i = 0; i < iNewValueLength; i++)
{
    int ID = arrayNewValues[i][0];
    int iNewValue = arrayNewValues[i][1];
    (object.*lookup_table[ID])(iNewValue);
}

但是,我遇到了兩個問題:

  1. 我每個類有多個對象,所以我需要能夠在我的 lookup_table 中為不同的單個對象擁有單獨的條目(即使它們具有相同的功能)。 舉個例子,我有不同的人,他們的高度得到更新,所以我保存了每個單獨的“人類對象”的高度設置函數,並在我得到更新時將更新的高度值傳遞給正確的對象。 lookup_table[5]可能指向人類對象編號 2 的高度設置函數。我無法理解如何實現這一點,我偶然發現了這個問題 這是我想要的還是有其他方法?

  2. 我有多個不同的類,所以我不能把它們都放在一個查找表中(或者我可以嗎?)。 由於我無法控制 ID 的分配方式,這意味着我不能假設它們是有序的並執行類似的操作

if (ID < 10)        (object1.*lookup_table_object1[ID])(iNewValue);
else if (ID < 20)   (object2.*lookup_table_object2[ID])(iNewValue);
...

我該怎么辦?

在此先感謝您提供正確方向的任何幫助或指示!

考慮以下具有接受int參數的成員函數的示例類:

struct X {
  void f1(int i) const { std::cout << "X::f1(" << i << ")\n"; }
  void f2(int i) const { std::cout << "X::f2(" << i << ")\n"; }
};

struct Y {
  void f1(int i) const { std::cout << "Y::f1(" << i << ")\n"; }
  void f2(int i) const { std::cout << "Y::f2(" << i << ")\n"; }    
}; 

現在,假設您有這些類的一些對象:

X x;
Y y;

為了實現您的目標,您可以創建一個值類型為std::function<void(int)>查找表

std::map<int, std::function<void(int)>> m; 

然后,您可以使用代表對象(可能是不同類的不同對象)及其成員函數的特定組合的lambdas (或以舊方式使用std::bind填充這樣的查找表

m[1] = [&x](int i){ x.f1(i); };
m[2] = [&x](int i){ x.f2(i); };
m[3] = [&y](int i){ y.f1(i); };
m[4] = [&y](int i){ y.f2(i); };

最后,調用這些函數:

m[3](12);
m[2](-1);

哪些輸出:

Y::f1(12)
X::f2(-1)

現場演示: https : //wandbox.org/permlink/GGPaNJ15EIm9g5gy

請注意 lambdas 中可能的懸空引用 只要查找表中的條目鏈接到它們,被引用的對象通常需要存在。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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