假設我們有一個函數,其中A
和B
是用戶定義類型的兩個重載:分解出一個重載函數調用
void f(A &a, B *b);
void f(B *b);
我們也有一個功能對應的重載實現算法:
void alg(A &a, B *b) {
// ... some code calling f(a,b)
}
void alg(B *b) {
// ... same code as alg(A &a, B *b), with f(a,b) replaced by f(b)
}
有沒有一種方法來分解撥打電話f
避免在這種情況下的代碼重複?如果你不能使用C++ 11像拉姆達功能,只需使用仿函數或抽象類的地方拉姆達的
版本與仿函數(
template<typename T>
static function doAlg(T fct)
{
// Common code, use fct() instead of f(a,b) or f(b)
}
void alg(A &a, B*b)
{
doAlg([&a, b](){ f(a,b); }); // when doAlg call fct(), it will call f(a,b);
}
void alg(B*b)
{
doAlg([b](){ f(b); }); // when doAlg call fct(), it will call f(b);
}
:
http://stackoverflow.com/questions/6829241/perfect-forwarding-whats-it-all-about? – user3159253
@ user3159253在這種情況下,我看不出有多完美的轉發幫助。請特別注意,參數的數量因過載而異。 – AlwaysLearning
你想盡量減少哪些代碼?來源還是編譯? 'alg(...)'除了將它們傳遞給'f(...)'之外還使用它的參數嗎? – Deduplicator