2016-09-20 5 views
1

は、私たちがABは、ユーザー定義型である関数の2つのオーバーロードを、持っているとしますファクタリングアウトオーバーロードされた関数呼び出しは

void f(A &a, B *b); 
void f(B *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); 
} 

+0

http://stackoverflow.com/questions/6829241/perfect-forwarding-whats-it-all-about? – user3159253

+1

@ user3159253この場合、完全転送がどのように役立つかわかりません。特に、パラメータの数は過負荷の間で変化することに注意してください。 – AlwaysLearning

+0

どのコードを最小化しますか?ソースまたはコンパイル? 'alg(...)'はそれらの引数を 'f(...)'に渡すのとは別に使用しますか? – Deduplicator

答えて

3

可能な解決策は、ラムダを使用しています)あなたは/ラムダを使用しないことができない場合:

struct CallFWithAB 
{ 
    CallFWithAB(A &a, B *b): 
     _a(a), _b(b) 
    {} 

    A &_a; 
    B *_b; 

    void operator()() 
    { 
     f(_a,_b); 
    } 
} 

struct CallFWithB 
{ 
    CallFWithAB(B *b): 
     _b(b) 
    {} 

    B *_b; 

    void operator()() 
    { 
     f(_b); 
    } 
} 

template<class T> 
static function doAlg(T& fct) 
{ 
    // Common code, use fct() instead of f(a,b) or f(b) 
} 

void alg(A &a, B*b) 
{ 
    CallFWithAB caller(a,b); 
    doAlg(caller); // when doAlg call fct(), it will call f(a,b); 
} 

void alg(B*b) 
{ 
    CallFWithB caller(b); 
    doAlg(caller); // when doAlg call fct(), it will call f(b); 
} 
+0

'doAlg()'は、 'std :: function'を構築する必要性を避けるためにテンプレート化することができます。 –

+0

@RichardHodges右、毎回忘れてしまいます。修正済み – Garf365

+0

@RichardHodges恐らく疑わしい質問のために申し訳ありません。私は貯蓄が何であるか分かりません。 – AlwaysLearning

3

あなたは可変引数テンプレートを使用して、完璧な転送を使用することができます。

template <typename... Args> 
void alg(Args&&... args) 
{ 
    // ... 

    f(std::forward<Args>(args)...); 

    // ... 
} 
+0

非常に良い解決策。私がそれを選択しなかった唯一の理由は、同様の 'alg'メンバ関数を実装している他のクラスとの一貫性のためにパラメータリストを保持したいということです。 – AlwaysLearning

関連する問題