什么类型可以保存 C++ 中不同类的成员函数指针?

Posted

技术标签:

【中文标题】什么类型可以保存 C++ 中不同类的成员函数指针?【英文标题】:What type can hold member-function-pointers of difference classes in C++? 【发布时间】:2010-03-18 03:23:25 【问题描述】:

我需要一个数组来保存不同类的成员函数指针。如何定义数组?

代码应如下所示:

arr[0] = &CMyClass::FuncX;
arr[1] = &CYourClass::FuncY;
arr[2] = &CHerClass::FuncZ;

我试过void*,但它不起作用。

【问题讨论】:

【参考方案1】:

你不能;它们都是不同的类型,数组是同构的。

无论参数是什么或返回值是什么,都有一个隐含的this,它是类类型所独有的。类成员指针的类型为:

return_value (class_type::*)(parameters);

如您所见,因为它们属于不同的类,所以它们总是不同的类型。即使是同一个类,return_valueparameters 也必须一致才能创建数组,否则你仍然会有不同的类型。

更大的图景是什么?想到Boost.Bind 和Boost.Function。此外,虚函数可能会解决您的问题。

【讨论】:

【参考方案2】:

正如其他人所指出的,您不能直接存储指向不同类型函数的指针。您可能想查看Command 模板,例如来自Modern C++ Design,它至少可以让您放置不同的可调用“事物”(指向函数、函子、成员函数的指针或智能指针)变成一个单一的东西。

就其本身而言,这可能还不够——您(显然)最终会得到在不同类型上实例化的模板,这会产生不同的类型。这些类型都将使用相同的语法,但不会都进入数组(需要单一类型)。

根据您的限制(特别是编译时与运行时索引),您可以使用 Boost::tuple 来存储命令对象的集合。您可以将其视为一个数组,使用数字索引来获取单个项目。然而,与普通数组不同:

    语法有点难看,而且 索引必须在编译时完成(使用编译时常量)。

【讨论】:

【参考方案3】:

在不知道函数的参数或返回类型的情况下,很难为您定义它们,请查看page 以了解它的要点或发布函数的声明。

【讨论】:

【参考方案4】:

其他人已经注意到您为什么不能这样做。但即使你可以,你能用它做什么。为了调用一个成员函数指针,你需要一个适当类型的对象来调用它。所以你需要知道每个成员函数指针的类型。你需要退后一步,弄清楚你想要完成的是什么。

【讨论】:

以上是关于什么类型可以保存 C++ 中不同类的成员函数指针?的主要内容,如果未能解决你的问题,请参考以下文章

指向不同类的成员函数的指针

c++中的虚函数有啥作用?

C++ 「静态数据成员」和「静态成员函数」的简单认识

C++ 指向具有匹配函数签名的任何类的成员函数的指针

C++要点总结

c++中如何获取函数名,和获取到一个基类指针后,如何判断它里面保存的是那个子类类型对象?