c++ - 从一个类到任何类的成员函数的函数指针

标签 c++ c++11

我在定义可以指向任何成员函数(不仅仅是指定类的成员函数)的函数指针时遇到了困难。

例如,C++ 强制我指定指向成员函数的函数指针将指向的类:

typedef void (Foo::*MyFunctionPointerTypeName)(int);

但是如果这个函数指针要指向的类成员函数不在Foo中怎么办?那么我将如何写这个,或者我可以使用什么替代方法?


更新:对于任何想快速回答如何使用 C++11 std::function 来完成此操作的人(因为关于该主题的教程似乎假设很多读者):

定义(来自 Foo):

std::function<void(int)> _fun;

绑定(bind)(来自任何类):

objFoo->_fun = std::bind(&SomeOtherClass::memberFunction, 
    this, std::placeholders::_1);

调用它(从 Foo 中)

if(_fun != nullptr) _fun(42);

如果您的函数没有参数,您可以删除 std::placeholders::_1。如果您的函数有两个参数,您还需要添加 std::placeholders::_2 作为std::bind 的参数.三参数、四参数等也是如此。

最佳答案

您不能编写可以指向任何 类成员的成员指针。请记住:成员指针的参数之一是类实例本身。指针是有类型的,因此其参数的类型在很大程度上是指针类型的一部分。

不过,您可以使用std::function,它可以存储各种可调用对象。您实际如何调用它(即:您给它什么参数)取决于您的需要,因为您还没有解释您要做什么。

关于c++ - 从一个类到任何类的成员函数的函数指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14316348/

相关文章:

c++ - _mm_shuffle_ps 即使包含 header 也未声明

c++ - 如何直接从 LLVM 源代码树使用新编译的 LLVM 工具?

c++ - WinRT CryptographicEngine::加密/解密抛出 InvalidArgumentException

c++ - 1 channel 位图到 SDL_Texture

c++ - 在 C++ 示例中解密 AES

c++ - 没有指针算法的自定义分配器

c++ - 在二进制存档中使用Boost序列化时出错

c++ - 使用范围保护时如何避免警告?

堆栈中的 C++ 类对象作为 Map 的值插入

c++ - 将取消引用的对象分配给对象会导致段错误