C ++函数指向任何类类型的非静态成员函数

时间:2017-03-01 23:38:48

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

我已经看到了一些例子,如何创建一个指向特定类类型的C ++类非静态成员的函数指针。但是,我会使用适用于任何类型类的指针。为了证明这个想法,我写了一个伪示例:

class A
{
    public:
    A(){} //constructor    
    void callMe() { /* do something */ }
};

class B
{
    public:
    B(){} //constructor    
    void callMe() { /* do something */ }
};


main()
{
    A aa;
    B bb;

    //pseudo part:
    generic_method_pointer_type p; //how to define the type of p?

    p=HOWTO;//set pointer p to point to A::callMe. How to do?

    p(aa); //A::callMe on instance aa gets called

    p=HOWTO;//set pointer p to point to B::callMe. How to do?

    p(bb); //B::callMe on instance bb gets called
}

这看起来有可能吗?

我知道C ++ 11有一些新的技巧,例如 std :: function 。我在std :: function上做了一些实验,发现它对于在小型微控制器上运行的实时应用来说太慢了。这就是为什么我更喜欢直接硬编码指针,这会导致最小的开销。

感谢您的建议!

1 个答案:

答案 0 :(得分:0)

从MBED项目源代码(他们的FunctionPointer类)找到一个完美工作的解决方案:

工作示例:

A foo;
typedef void (A::*MethodPtr) ();
MethodPtr method = &A::callMe;
Foo *obj = &foo;
for(i=0;i<100000000;i++) //callback overhead test
    (obj->*method)();

FunctionPointer中的代码对我来说不是很明显它是如何工作的。它记忆了一些数据等任何想法,如果它可以简化&amp;做得更快?与类类型固定的情况相比,它仍然会导致更多的开销,例如:

ArrayList

当callMe仅包含asm(&#34; nop&#34;)时,与FunctionPointer方法相比,上述方法快4倍。关于x86&amp; amp;的一些基准测试GCC:

  • 直接拨打205 ms
  • 上述函数指针示例258 ms
  • FunctionPointer示例1049 ms
  • std :: function 3951 ms

非常感谢任何优化创意!