我已经看到了一些例子,如何创建一个指向特定类类型的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上做了一些实验,发现它对于在小型微控制器上运行的实时应用来说太慢了。这就是为什么我更喜欢直接硬编码指针,这会导致最小的开销。
感谢您的建议!
答案 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:
非常感谢任何优化创意!