2017-04-05 14 views
0

このような動作を実装することは可能ですか?継承を使用する必要はありません。私は、(C++テンプレートを使用して)汎用引数を渡してテンプレートメソッド設計パターンを実装したいだけです。後で実装される関数を使用するクラスメソッドテンプレートを作成する

class A { 
public: 
    template<typename ...tArgs> 
    void call(tArgs ...vArgs) { 
     for (int i = 0; i < 5; ++i) 
      impl(vArgs...); 
    } 
}; 

class B : public A { 
public: 
    void impl() {} 
    void impl(int) {} 
}; 

int main() { 
    B b; 
    b.call(); // ok 
    b.call(1); // ok 
    b.call(""); // compile error, no method to call inside 'call' 
    return 0; 
} 
+1

非常に明確ではありません。あなたの例では、コンパイル時に 'const char *'のオーバーロードがないので、そのコンパイルエラーが発生します。 –

+0

[そのコードの唯一の誤りではありません](http://coliru.stacked-crooked.com/a/6dc7e20197d5f898) 'impl'が解決できないため、' call'を呼び出す人はいません。 – WhozCraig

+0

この例は、前回の呼び出しなしのイベントでは機能しません。私は希望の行動だけを説明しました。 – omicronns

答えて

3

これは、ほとんど必要なだけいくつかの小さな変更CRTP patternの古典的な例である:あなたが達成したいものを

// A is now a template taking its subclass as a parameter 
template <class Subclass> 
class A { 
public: 
    template<typename ...tArgs> 
    void call(tArgs ...vArgs) { 
     for (int i = 0; i < 5; ++i) 
      // need to static cast to Subclass to expose impl method 
      static_cast<Subclass*>(this)->impl(vArgs...); 
    } 
}; 

// pass B into A template (the "curiously recurring" part) 
class B : public A<B> { 
public: 
    void impl() {} 
    void impl(int) {} 
}; 

int main() { 
    B b; 
    b.call(); // ok 
    b.call(1); // ok 
    // b.call(""); // will cause compile error, no method to call inside 'call' 
    return 0; 
} 
関連する問題