1

使用该网站很长时间了,它为我解答了无数问题。我已经编程很长时间了,但我是 C++ 新手。这是我在这里的第一个问题。

我需要一个包含成员函数指针的数组。数组将指向的函数具有相同的参数和返回类型,但是是不同类的成员。是否可以将指向不同类的成员函数的指针存储在同一个数组中?

4

2 回答 2

1

假设您要在数组中存储指向成员类型的指针,答案是:这取决于。这取决于您的类之间是否存在层次关系。

如果您的类完全不相关,那么您只能reinterpret_cast将指针指向某些常见类型,例如void (SomeArbitraryClass::*)(),然后reinterpret_cast在执行调用时将它们恢复为原始类型。这基本上是一个“否”的答案,因为这只不过是一个相当丑陋的黑客。

(或者,正如 Dietmar Kühl 建议的那样,您可以使用类型擦除技术,例如std::function<>C++11 中提供的技术,将可调用对象存储在您的数组中。不过,这些对象将不再是指向成员的指针。)

但是,如果您的类是同一类层次结构的成员,那么您可以依赖于 C++ 中的类成员指针是逆变的这一事实。这意味着指向基类成员的指针可以隐式转换为指向派生类成员的指针。即使它们不隐式地反向转换,该语言也支持通过static_cast. 因此,您必须在填充数组时为数组元素指定类型R (CommonBaseClass::*)(Args)并使用该类型。static_cast在这种情况下,您不必在执行调用时将这些指针转换回原始类型 - 该语言将自行正确执行所有操作(假设您在指针取消引用时提供正确类型的对象)。

于 2013-10-04T23:30:55.370 回答
0

您可以将类的对象视为成员函数的附加参数(基本上,成为this指针)。因此,由于成员函数都获得不同的参数类型,因此您不能将它们直接存储在数组中。但是,您可以使用类似std::function<RC(Args)>. 当您拥有不同类的成员时,您可能需要提供合适的对象,这些对象可以使用std::bind().

于 2013-10-04T22:40:03.317 回答