c++ - 指向未指定类类型的成员函数指针 - 这可能吗?

标签 c++ function-pointers pointer-to-member c++03

是否可以声明一个可以指向任何类(阅读:不是特定类)的成员函数的函数指针(非 C++ 11)?

例如,如果我有 A、B 和 C 类。C 中声明了一个函数指针,我想在指向 B 的成员函数之一和 A 的成员函数之一之间切换该指针。 C++ 允许这样做吗?

最佳答案

是的,你可以,但你必须删除一些类型安全并跟踪 this 指针以及成员函数。

您可以在 http://www.codeproject.com/Articles/11015/The-Impossibly-Fast-C-Delegates 中看到一个用例.基本思想是将对象指针存储为空指针,并通过静态方法重定向函数调用。

#include <iostream>
using namespace std;

struct A { void foo() { cout << "A::foo\n"; } };
struct B { void foo() { cout << "B::foo\n"; } };

class C
{
public:
    C() : object_ptr(0), stub_ptr(0) {}

    template <class T, void (T::*TMethod)()>
    static C from_method(T* object_ptr)
    {
        C d;
        d.object_ptr = object_ptr;
        d.stub_ptr = &method_stub<T, TMethod>;
        return d;
    }

    void operator()() const
    {
        return (*stub_ptr)(object_ptr);
    }

private:
    typedef void (*stub_type)(void* object_ptr);

    void* object_ptr;
    stub_type stub_ptr;

    template <class T, void (T::*TMethod)()>
    static void method_stub(void* object_ptr)
    {
        T* p = static_cast<T*>(object_ptr);
        return (p->*TMethod)();
    }
};

int main() 
{
    A a;
    B b;

    C c = C::from_method<A, &A::foo>(&a);

    c();

    c = C::from_method<B, &B::foo>(&b);

    c();

    return 0;
}

上面的代码应该打印出来

A::foo
B::foo

此解决方案比使用 std::function 更快,因为它不需要为数据分配堆存储空间,但这可能仅用于引用成员函数(不同于 std: :function 声明任何可调用对象的所有权)。

关于c++ - 指向未指定类类型的成员函数指针 - 这可能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8898587/

相关文章:

c++ - 使用字符串流解析字符串时,它会提取换行符

function - 在对象 slice 内搜索关键属性的简洁 Golang 方式

C++ 指向使用模板的非静态成员函数的指针

c++ - 如何从另一个嵌套类中调用某个封闭类的嵌套类的函数指针成员的值?

c++ - 为什么我可以使用 for 循环而不是单独访问 C++ map 元素?

c++ - ImportError undefined symbol PyUnicodeUCS2_FromObject

c++ - 调试优先级队列程序时出现访问冲突错误

c++ - 后期绑定(bind)有什么优点?举一个 C++ 函数指针上下文中的例子

将具有不同指针类型的函数指针转换为参数

c++ - 没有 typedef 的运算符 member_function_pointer_type()?