2008-09-30 25 views
5

Ben parametrelerin değişken sayılar ile geri aramalar işlemek için kullanmak geri arama sınıfların bir dizi var. Şu anda farklı sayıda argümanı işlemek için 6 farklı örneğim var. Değişken sayıda argüman tutabileceğinden bir örnek yapmak için bir yol var mı? Nihayetinde her bir parametrenin bir POD tipi veya bir sınıf işaretçisi veya bir yapısal işaretçi olmasını isterim. Herhangi bir fikir?Şablon sınıfındaki değişken sayıda parametreyi işlemenin bir yolu var mı?

template <class T> 
class kGUICallBackPtr 
{ 
public: 
    kGUICallBackPtr() {m_obj=0;m_func=0;} 
    void Set(void *o,void (*f)(void *,T *)); 
    inline void Call(T *i) {if(m_func) m_func(m_obj,i);} 
    inline bool IsValid(void) {return (m_func!=0);} 
private: 
    void *m_obj; 
    void (*m_func)(void *,T *); 
}; 


template <class T,class U> 
class kGUICallBackPtrPtr 
{ 
public: 
    kGUICallBackPtrPtr() {m_obj=0;m_func=0;} 
    void Set(void *o,void (*f)(void *,T *,U *)); 
    inline void Call(T *i, U *j) {if(m_func) m_func(m_obj,i,j);} 
    inline bool IsValid(void) {return (m_func!=0);} 
private: 
    void *m_obj; 
    void (*m_func)(void *,T *,U *j); 
}; 

cevap

0

Nasıl Boost Bind kullanımı yoluyla bu sorunu sidestepping hakkında? Kodunuzun tek bir bağımsız değişkeni kabul etmesini veya hiç yapmadığını ve arama sitesinde ihtiyacınız olan argümanları bağlamanızı sağlayabilirsiniz.

3

C++ 0x variatdic şablonlar en iyi bahis, ama kullanmadan önce de bir süre olacaktır. Bugün türleri dizileri gerekiyorsa

, bir MPL en vector türleri bakmak, hem de diğer tip dizisi türlerini dikkate alırız. Bu, Boost kitaplığının bir parçasıdır. Sadece tek bir tür yerine, bir dizi olan bir şablon argümanı sağlamanıza olanak tanır.

0

Benim ilk tercihi için hedefe ulaşmak için, boost :: bağlama kullanmak artırmak :: işlevi veya std :: bağlama/std :: fonksiyonu ve/veya C++ 11 lambda en olacaktır. Kendi functor rulo gerekiyorsa Ama sonra tek şablon argüman alır 'kaynaşmış functor' oluşturmak için boost füzyon kullanırsınız.

http://www.boost.org/doc/libs/1_41_0/libs/fusion/doc/html/fusion/functional/generation/functions/mk_fused.html

Sonuçta tüm bu kütüphanelerin varidic şablonlar eksikliği gidermek için mümkün olan tüm seçenekleri numaralandırmak için ön işlemci makroları kullanabilirsiniz.

İlgili konular