2017-04-05 42 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)這些調用'call'都不起作用,因爲'impl'無法解析。 – 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; 
} 
相關問題