2013-06-07 30 views
6

Yarım saat önce variadic şablon parametrelerini keşfettim ve şimdi tamamen bağlandım.C++ varadic template sınıf sonlandırma

Mikrodenetleyici çıkış pimi için statik sınıf tabanlı bir soyutlama var. Bir dizi çıkış pimini gruplamak istiyorum, böylece onları bir pim olarak kullanabilirim. Aşağıdaki kod çalışır, ama ben bunu denedim 0 parametrelerine yerine 1.

template< typename pin, typename... tail_args > 
class tee { 
public: 

    typedef tee<tail_args...> tail; 

    static void set(bool b){ 
     pin::set(b); 
     tail::set(b); 
    } 

}; 

template< typename pin > 
class tee<pin> { 
public: 

    static void set(bool b){ 
     pin::set(b); 
    } 

}; 

özyinelemeyi sona muktedir gerektiğini düşünüyorum ama derleyici (gcc) dikkate almak değil görünüyor:

template<> 
class tee<> : public pin_output { 
public: 

    static void set(bool b){} 

}; 

Hata iletisi uzun, ancak aslında hiçbir tee <> olduğunu söylüyor. Benim tee < sorun var mı> yoksa özyineleme sona mümkün değildir

+0

kullandığınız GCC sürümü nedir? GCC 4.8 mi ve '-std = C++ 11 'bayrağını (-Wall' ile de) geçtiniz mi? –

+0

Yazımınız "template class tee" olmalı ve fesih durumunuz "template <> class tee <> {};' olmalıdır. –

+0

@Basile: 4.7.2; -std = C++ 0x kullanılır; -std = C++ 11 kullanarak -Wall hiçbir değişiklik yapmaz; –

cevap

6

Sizin en genel durumda en az 1 argüman (pin) sürdüğünden ödemeyi 0 değişkenleri olduğu bir uzmanlık, oluşturamazsınız.

Bunun yerine, en genel durumda vermesi gerektiğini değişkenlerden herhangi biri miktarını kabul eder:

template<typename...> class tee; 

Ve sonra uzmanlık oluşturun:

template< typename pin, typename... tail_args > 
class tee<pin, tail_args...> { 
public: 

    typedef tee<tail_args...> tail; 

    static void set(bool b){ 
     pin::set(b); 
     tail::set(b); 
    } 

}; 

template<> 
class tee<> { 
public: 

    static void set(bool b){} 

}; 
+0

Fantastik, bir çekicilik gibi çalışır ve yolumda küçük bir adımdır :) –