C++

2010-03-17 12 views
11

'daki kareler, varyant şablonları ve CRTP İşte senaryo: Değişken sayıda karma karışıma sahip olabilecek bir ana bilgisayar sınıfına sahip olmak istiyorum (değişken şablonlarla çok zor değil - bkz. Örneğin, http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.103.144). Bununla birlikte, karıĢımların ana sınıf tarafından parametrelenmesini de istiyorum, böylece genel türlerine (CRTP deyimini kullanarak) başvurabilirler. Sorun, ikisini karıştırmaya çalışırken ortaya çıkar - doğru sözdizimi bana net değil. hata ileC++

template <template<class> class... Mixins> 
class Host : public Mixins<Host<Mixins>>... { 
    public: 
    template <class... Args> 
    Host(Args&&... args) : Mixins<Host>(std::forward<Args>(args))... {} 
}; 

template <class Host> struct Mix1 {}; 

template <class Host> struct Mix2 {}; 

typedef Host<Mix1, Mix2> TopHost; 
TopHost *th = new TopHost(Mix1<TopHost>(), Mix2<TopHost>()); 

:

tst.cpp: In constructor ‘Host<Mixins>::Host(Args&& ...) [with Args = Mix1<Host<Mix1, Mix2> >, Mix2<Host<Mix1, Mix2> >, Mixins = Mix1, Mix2]’: 

tst.cpp:33: instantiated from here 

tst.cpp:18: error: type ‘Mix1<Host<Mix1, Mix2> >’ is not a direct base of ‘Host<Mix1, Mix2>’ 

tst.cpp:18: error: type ‘Mix2<Host<Mix1, Mix2> >’ is not a direct base of ‘Host<Mix1, Mix2>’ 

herkes başarılı deneyimi cRTP ile variadic şablonlar karıştırma var mı Örneğin , aşağıdaki kod g ++ 4.4.1 ile derlenmeyecektir?

cevap

6

Aşağıdakiler işe yarar görünüyor. Parametre paketini yerinde genişleten miras alınan karışım sınıflarına Mixins... ekledim. Host şablonunun gövdesi dışında, Host numaralı tüm şablon parametreleri belirtilmelidir, dolayısıyla Mixins... amacına hizmet eder. Vücudun içinde, tüm şablon parametrelerini hecelemeye gerek yok sadece Host yeterlidir. Kısa bir el.

#include <utility> 

template <template<class> class... Mixins> 
class Host : public Mixins<Host<Mixins...>>... 
{ 
    public: 
    Host(Mixins<Host>&&... args) : Mixins<Host>(std::forward<Mixins<Host>>(args))... {} 
}; 

template <class Host> struct Mix1 {}; 
template <class Host> struct Mix2 {}; 

int main (void) 
{ 
    typedef Host<Mix1, Mix2> TopHost; 
    delete new TopHost(Mix1<TopHost>(), Mix2<TopHost>()); 
} 
+0

Temditli kurucu içerecek şekilde değiştirdim. template Sunucu (Args && ... args): Katmalar ... Sumant {} – Sumant

+0

Teşekkür (STD) öne > (args ::). Öneriniz mantıklı, ama benim için bir şekilde işe yaramaz. Hangi derleyici sürümünü kullanıyorsunuz? Bu kodu kopyaladım ve yapıştırdım ve derleme yaparken: tst2.cpp: 'int main()' işlevinde:: tst2.cpp: 16: hata: 'Ana makine numaralı aramaya eşleşen işlev yok: : Ana bilgisayar (Mix1 >, Mix2 >) ' tst2.cpp: 7: not: adaylar şunlardır: Ana makine :: Ana bilgisayar (Mixins > && ...) [Mixins = Mix1, Mix2] tst2.cpp: 5: not: Host :: Ana Bilgisayar (const Ana Makine &) – Eitan

+0

Oh, düzeltmenizi kaçırdım. Bu, "eşleşen işlev yok" hatasını düzeltir, ancak "derleyici hatası" ile patlar. :) Bu yüzden hangi derleyiciyi kullanıyorsunuz? – Eitan