[英]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);
}
但是,我遇到了兩個問題:
我每個類有多個對象,所以我需要能夠在我的 lookup_table 中為不同的單個對象擁有單獨的條目(即使它們具有相同的功能)。 舉個例子,我有不同的人,他們的高度得到更新,所以我保存了每個單獨的“人類對象”的高度設置函數,並在我得到更新時將更新的高度值傳遞給正確的對象。 lookup_table[5]
可能指向人類對象編號 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.