注意:下面的代碼示例不是真正的代碼,真正的代碼在這裏粘貼起來要複雜得多,所以這個例子看起來很荒謬,但並不重要。用於重載成員函數的成員函數指針
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