2010-03-01 24 views
8

Projelerimde veri işleme sınıfları için bir şablon arabirimi oluşturmak istiyorum.Yöntemin bir parametresine şablon parametresi olarak imzalanması

böyle bir şey yazabilirsiniz: Bir şekilde benim şablon arayüzü tanımlayabilirsiniz, soru gel, Şimdi

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

:

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

, herhalde, bir sınıf bu şekilde tanımlamak Parametre olarak, sadece T'yi değil, Process() işlevinin tüm imzasını da alır. Mümkün

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

mi:

bu şekilde çalışma şey istiyorum? Örneğin, boost :: signal'in şablon parametrelerini bu şekilde aldığını biliyorum, fakat eğer doğru bir şekilde anlarsam orada çok fazla kara büyü kullanırlar.

cevap

12

Evet yapabilirsin. Ancak C++ 03'te, her bir parametre sayısı için kopyala/yapıştır koduna sahip olmanız gerekir (çok kötü değil, çünkü burada const/non-const vb. Için aşırı yüklenmelere gerek yoktur).

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 olarak

, sen

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 */ } 
}; 

Ne kadar güzel yazmak mümkün olacak!

+0

Şimdi soru şu: İşyerinde günlük kullanıma değişken şablonlar koyabilene kadar kaç yıl geçecek? Ne kadar basit olabileceğini bilmek ... –

+0

DataProducer arayüzünde Process() işlevinde birden fazla parametreyi desteklemek için bunu nasıl değiştirmeliyim? Yani, DataHandler Lev

+0

@ Lev gibi bir şeyi desteklemeyi tercih ediyorum, "İşlem" işlev bildirimini almanız için fonksiyon türünde "DataHandler" işlevini kısmen uzmanlaştırmanız gerektiğinden şüpheleniyorum doğru da. 'boost :: function' gerekli kodu üretmek için önişlemciyi kullanır, ancak kendi projeleri ve birkaç kullanım için, bu konuya kendinizi tanıtmanız (benim fikrime göre) artık daha fazla ihtiyaç duymadığınız için pek de yararlı değildir. Bu yüzden sadece 4 kez kopyala/yapıştır ve bitirin :) –

İlgili konular