注意:下面的代码示例不是真正的代码,真正的代码在这里粘贴起来要复杂得多,所以这个例子看起来很荒谬,但并不重要。用于重载成员函数的成员函数指针
struct Base
{
void beginEvent(int a)
{
impl(a, &Base::onBeginEvent, &Base::onBeginEvent);
}
void endEvent(int a)
{
impl(a, &Base::onEndEvent, &Base::onEndEvent);
}
void impl(int a, void (Base::*func1)(int), void (Base::*func2)(int, int))
{
//some complicated behavior
//...
(this->*func1)(a);
(this->*func2)(a, -a);
}
virtual void onBeginEvent(int a){}
virtual void onBeginEvent(int a, int negativeA){}
virtual void onEndEvent(int a){}
virtual void onEndEvent(int a, int negativeA){}
};
和
struct Derived : public Base
{
void onBeginEvent(int a) { std::cout << a << "\n"; }
void onEndEvent(int a, int b) { std::cout << a << "==(-(" << b << "))\n"; }
};
int main()
{
Derived d;
d.beginEvent(3);
d.endEvent(9);
return 0;
}
我的问题是: 是真的有必要定义impl
功能需要void (Base::*func1)(int)
和void (Base::*func2)(int, int)
的方式,即使我知道这是一个成员函数指针(&Base::onBeginEvent
在这种情况下, )?
当只提供其中一个我显然得到太少resp。在打电话时要多加争论。我不想要可变参数函数或其他东西,我想要有限数量的可以Base提供给Derived的方法。派生可能只需要一个,或者提供的方法的任何子集被调用。但我知道,它们只会在同一个符号上超载。我的目标不是让它适用于一些疯狂的解决方法,我只想知道,如果我可以减少发布的代码。
编辑 THME在我真正的代码实现了一套方法是相当复杂的,芽的开始,只是与IMPL年底不同的呼叫结束同...
物质是正确的,但我觉得音调是不必要的苛刻。 –
谢谢你指出。虽然答案是什么?没有办法将'impl(a,&Base :: onBeginEvent,&Base :: onBeginEvent);'改成'impl(a,&Base :: onBeginEvent);'? – relaxxx
当然不是!你可以使用其他函数'foo',并且永远不会改变它们与不相关函数的事实,其中一个函数可以发送宇宙飞船到月球,其他人则试图找到一个小偷。唯一导致你感觉他们有联系的是他们有相同的名字。但是,计算机,特别是我们可爱的C++能够理解它吗?但是你可以编写一个宏来为你编写,如果你真的想要它 – BigBoss