2013-04-22 29 views
5

Potrzebuję (chcę), aby specjalizować metodę wewnątrz klasy szablonów, aby zezwalać tylko określonym typom pierwotnym. (To nie jest duplikatem kwestia this)Specjalizacja metody szablonów wewnątrz szablonu klasy

Cóż mam tej klasy:

template<typename TYPE, size_t NB> 
class X 
{ 
public: 
    template<typename arg_type> 
    X& get(const arg_type var); 
} 

Chciałbym specjalizować arg_type aby umożliwić jedynie liczby całkowite, coś takiego:

template<typename TYPE, size_t NB> template<unsigned long> X& X::get(const unsigned long val); 

Ale na pewno powyższe nie działa, ani na msvc2011, ani na gcc

Dokładniej, staram się napisać kod na podstawie szablonów wpisz powyżej i napisz specjalizację, aby każdy, kto używa tej klasy X, nie mógł użyć tej metody z czymś innym niż wyspecjalizowanym.

Czy to możliwe? a jeśli tak, to czy to źle?

Dzięki z góry, jav974

+1

Dlaczego według ciebie najlepszym rozwiązaniem jest posiadanie szablonu zagnieżdżonego? Mimo że możesz to zrobić, mogą istnieć czystsze i prostsze rozwiązania, takie jak brak szablonu zagnieżdżonego i przeciążenia, które nie są szablonami ... –

Odpowiedz

4

Specjalizacja nie jest to, czego chcą. Korzystając ze specjalizacji, można zapewnić specjalny sposób traktowania instancji metody szablonów przy użyciu typu całki bez znaku, ale nic nie uniemożliwia użytkownikowi utworzenia instancji za pomocą innego typu.

Można to osiągnąć stosując kilka SFINAE:

#include <type_traits>  

template<typename TYPE, size_t NB> 
class X 
{ 
public: 
    template<typename arg_type> 
    typename std::enable_if<std::is_unsigned<arg_type>::value, X&>::type // arg_type is unsigned 
    get(arg_type val) 
    { 

    } 
}; 

Można również użyć static_assert, dzięki czemu użytkownicy otrzymują bardziej przyjazny komunikat o błędzie:

template<typename arg_type> 
X& get(arg_type val) 
{ 
    static_assert(std::is_unsigned<arg_type>::value, "The argument should be unsigned!"); 
} 

Jeśli chcesz parametr TYPE szablon do postępuj zgodnie z tymi samymi regułami, można również użyć static_assert:

+0

Niesamowite !! nie wiedziałem o tym, dziękuję bardzo !! Przy okazji "TYP" dla klasy powinien również przestrzegać tych samych zasad, gdzie powinienem umieścić tę kontrolę? ctor? – jav974

+0

@ jav974 zobacz moją edycję. – mfontanini

+0

Dzięki skałom oznaczam, że został rozwiązany! – jav974

Powiązane problemy