2013-06-07 16 views
6

Pół godziny temu odkryłem parametry szablonu variadic i teraz jestem całkowicie uzależniony.C++ varadic szablon terminacja klasy

Mam abstrakcję opartą na klasie statycznej dla szpilki wyjściowej mikrokontrolera. Chcę zgrupować pewną liczbę pinów wyjściowych, aby obsłużyć je jako jeden pin. Poniższy kod działa, ale myślę, że powinienem być w stanie zakończyć rekursji na 0 parametrów zamiast na 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); 
    } 

}; 

próbowałem tego, ale kompilator (gcc) wydaje się nie brać go pod uwagę:

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

    static void set(bool b){} 

}; 

Komunikat o błędzie jest długi, ale zasadniczo mówi, że nie ma tee <>. Czy jest coś nie tak z moim tee <> czy nie jest to możliwe, aby zakończyć rekursji

+0

Jaka wersja GCC używasz? Czy jest to GCC 4.8 i czy przekazałeś flagę '-std = C++ 11' (również z' -Wall')? –

+0

Twój typ powinien być 'szablon klasa tee', a twój przypadek zakończenia powinien być' szablon <> klasa tee <> {}; '. –

+0

@Basile: 4.7.2; Użyłem -std = C++ 0x; using -std = C++ 11 -Wall nie zmienia; –

Odpowiedz

6

Twój najbardziej ogólnym przypadku trwa co najmniej 1 argument (pin), więc nie można utworzyć specjalizację, która ma 0 argumenty.

Zamiast tego należy dokonać najbardziej ogólny przypadek, że akceptuje żadnego ilość argumentów:

template<typename...> class tee; 

a następnie utworzyć specjalizacje:

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

Fantastyczny, działa jak urok, a ja jestem małym krokiem w górę :) –