我需要一個數組來保存不同類的成員函數指針。我如何定義數組?什麼類型可以保存C++中差異類的成員函數指針?
的代碼應該是這樣的:
arr[0] = &CMyClass::FuncX;
arr[1] = &CYourClass::FuncY;
arr[2] = &CHerClass::FuncZ;
我試過void*
,但它不工作。
我需要一個數組來保存不同類的成員函數指針。我如何定義數組?什麼類型可以保存C++中差異類的成員函數指針?
的代碼應該是這樣的:
arr[0] = &CMyClass::FuncX;
arr[1] = &CYourClass::FuncY;
arr[2] = &CHerClass::FuncZ;
我試過void*
,但它不工作。
你不能;它們都是不同的類型,而且陣列是同類的。
無論參數是什麼或返回值是什麼,都有一個隱含的this
,它是類類型唯一的。該類型的類成員指針是:
return_value (class_type::*)(parameters);
正如你所看到的,因爲他們屬於不同的班級,他們將永遠是不同的類型。即使它是同一班級,return_value
和parameters
必須一致才能創建數組,否則您仍然會有不同的類型。
什麼是更大的圖片?想到了Boost.Bind和Boost.Function。另外,虛擬功能可以解決你的問題。
不知道函數的參數或返回類型很難定義它們,請看page以獲得它的要點或發佈函數的聲明。
正如其他人指出的,你不能直接存儲指向不同類型函數的指針。您可能需要查看Command
模板,例如,從Modern C++ Design,它至少可以讓您將不同的可調用的「事物」(指向函數,函子,成員函數的指針或智能指針)放入單一事物中。
它本身可能不足以滿足您的需求(顯然)會以不同類型實例化的模板生成不同的類型。這些類型都將使用相同的語法,但不會全部進入數組(需要單一類型)。
根據您的約束(特別是編譯時與運行時索引),您可以使用Boost :: tuple來存儲命令對象的集合。你可以將它看作一個數組,使用數字索引來獲取單個項目。與普通的陣列,但是:
其他人已經注意到爲什麼你不能這樣做。但即使你可以,你會怎麼做呢。爲了調用成員函數指針,你需要一個適當類型的對象來調用它。所以你需要知道每個成員函數指針的類型。你需要退後一步,弄清楚你試圖完成的是什麼。