什么类型可以在C ++中保存差异类的成员函数指针?

时间:2010-03-18 03:23:26

标签: c++ function-pointers member-function-pointers

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

代码应如下所示:

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

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

4 个答案:

答案 0 :(得分:3)

你不能;它们都是不同的类型,阵列是同质的。

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

return_value (class_type::*)(parameters);

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

大局是什么?我会想到Boost.Bind Boost.Function。此外,虚拟功能可以解决您的问题。

答案 1 :(得分:1)

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

就其自身而言,这可能是不够的 - 你(显然)最终会在不同类型上实例化模板,从而产生不同的类型。这些类型都将使用相同的语法,但不会全部进入数组(需要单一类型)。

根据您的约束条件(特别是编译时与运行时索引),您可以使用Boost :: tuple来存储命令对象的集合。你可以把它看作有点像数组,使用数字索引来获取单个项目。然而,与普通数组不同:

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

答案 2 :(得分:0)

如果不知道函数的参数或返回类型,很难定义它们,请查看此page以获取它的要点或发布函数声明。

答案 3 :(得分:0)

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