成员函数指针的 C++ 数组?

标签 c++ arrays function pointers member

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

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

最佳答案

假设您要将 pointer-to-member 类型的指针按字面意思存储在数组中,答案是:视情况而定。这取决于你的类之间是否存在层次关系。

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

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

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

关于成员函数指针的 C++ 数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19191813/

相关文章:

c++ - 如何在 Objective-C 中使用初始化列表

c++ - 像 "Foo(12,3);"这样的未命名变量的强制构造仍然是声明符吗?

JavaScript:如何加入/组合两个数组以连接成一个数组?

java - 如何在递归中做一次性的事情?

php - 我可以连接来自不同数据库的两个表吗?

javascript - 也可以在另一个函数中使用在 select 标记中声明的 onchange 函数元素吗?

c++ - 在文件中写入新行字符

c++ - 如何使模板函数成为另一个模板函数的参数?

Matlab:访问函数句柄中的隐藏参数

java - 使用 Classname.this.methodname