2010-03-01 115 views
8

我想爲我的項目中的數據處理類創建模板接口。將方法的簽名作爲模板參數傳遞給類

我可以寫這樣的事:

template <class T> 
class DataHandler 
{ 
    public: 
     void Process(const& T) = 0; 
}; 

然後,假設,我定義一個類是這樣的:

class MyClass: public DataHandler<int> 
{ 
    void Process(const int&) { /* Bla-bla */ } 
} 

現在想來,這個問題,我可以以某種方式定義我的模板界面作爲參數的方式不僅僅是輸入T,而是Process()函數的整個簽名。

我想工作的事情是這樣的:

class MyClass: public DataHandler<void (int&)> 
{ 
    void Process(const int&) { /* Bla-bla */ } 
} 

這可能嗎?我知道,舉例來說,boost :: signal以這種方式接收模板參數,但是,如果我理解正確,他們會在那裏使用大量的黑魔法。

回答

12

是的,你可以。但是在C++ 03中,你必須爲每一個參數進行復制/粘貼代碼(不是太糟糕,因爲在這裏你不需要重載const/non-const等等。const是已知的!)。

template<typename FnType> 
struct parm; 

template<typename R, typename P1> 
struct parm<R(P1)> { 
    typedef R ret_type; 
    typedef P1 parm1_type; 
}; 

template <class T> 
class DataHandler 
{ 
    typedef typename parm<T>::ret_type ret_type; 
    typedef typename parm<T>::parm1_type parm1_type; 

    public: 
     virtual ret_type Process(parm1_type t) = 0; 
}; 

class MyClass: public DataHandler<void (const int&)> 
{ 
    void Process(const int&) { /* Bla-bla */ } 
}; 

在C++ 0x中,你將能夠編寫

template <class T> 
class DataHandler; 

template<typename R, typename ... P> 
class DataHandler<R(P...)> 
{ 
    public: 
     virtual R Process(P... t) = 0; 
}; 

class MyClass: public DataHandler<void (const int&)> 
{ 
    void Process(const int&) { /* Bla-bla */ } 
}; 

如何更漂亮!

+0

現在問題依然存在:需要多少年,直到我們可以在工作中使用可變模板日常使用。知道它有多簡單可能會傷害... – 2010-03-01 13:37:58

+0

我應該如何改變它以支持DataProducer接口中的Process()函數中的多個參數?我想要支持像DataHandler Lev 2010-03-02 08:50:50

+0

@Lev之類的東西,我懷疑你將不得不在函數類型上部分專門化'DataHandler',所以你得到了'Process'函數聲明也是。 'boost :: function'使用預處理器來生成所需的代碼,但是對於自己的項目和一些用途,在將自己介紹到可能不再需要的主題方面很沒用。因此,只需複製/粘貼4次,然後完成:) – 2010-03-02 12:25:27

相關問題