2013-08-21 16 views
9

Chcę utworzyć weryfikatorów dla liczby różnego rodzaju (Integer, punkty pływających) np .:specjalizacja szablonu struct dla integralnych/Rynek typów

typename number_validator<T>::type validator; 

znalazłem użyteczne cechy w std tj is_integral i is_floating_point. Jak mogę wykorzystać te cechy, aby specjalizować szablon number_validator (to jest struct)?

edit: szukam czegoś takiego:

template<typename T, typename Enabled> 
struct number_validator {}; 

template<typename T> 
struct number_validator<T, typename enable_if<is_floating_point<T>::value, T>::type> 
//this doesn't work.. 
{ 
    typedef floating_point_validator type; 
}; 
+1

Co robi twój "walidator"? –

+0

to sprawdzi numery. Przygotowałbym ':: type' do typowania dla niektórych określonych klas ze wspólnym interfejsem (ale nie z podklasami). – Kiel

+0

Ja pytam: jak chcesz potwierdzić numery? Z pewnością jest to prostsza metoda. –

Odpowiedz

12

To może być to, czego szukasz, to znaczy tag wysyłki:

template<typename T, bool = is_integral<T>::value> 
struct number_validator {}; 

template<typename T> 
struct number_validator<T, true> 
{ 
    typedef integral_validator type; 
}; 

template<typename T> 
struct number_validator<T, false> 
{ 
    typedef floating_point_validator type; 
}; 

ta zakłada, że ​​naprawdę można operować na liczbach, więc typy są zawsze albo całkowite lub zmiennoprzecinkowe.

1

Nie trzeba nawet tych, w tym przypadku, można właściwie tylko specjalizują się szablony jak ten.

template <typename T> 
struct number_validator; 
template <> 
struct number_validator<float>; 

template <> 
struct number_validator<int>; 

template <> 
struct number_validator<double>; 

Będzie specjalizować swój numer walidator dla każdego typu, to wymaga, aby wymienić wszystkie integralne i pływających typy punktów. Można też zrobić coś takiego:

#include <type_traits> 
#include <iostream> 
template<class T> 
typename std::enable_if<std::is_floating_point<T>::value,T>::type func(T t) { 
    std::cout << "You got a floating point" << std::endl; 
    return t; 
} 

template<class T> 
typename std::enable_if<std::is_integral<T>::value,T>::type func(T t) { 
    std::cout << "You got an Integral" <<std::endl; 
    return t; 
} 

int main() { 
    float f = func(1.0); 
    int a = func(2); 
} 
+2

Nie chcę wyświetlać wszystkich typów integralnych i zmiennoprzecinkowych, które znam .. – Kiel

+0

To może faktycznie działać, ale czy możesz usunąć 'auto' (tutaj C++ 03)? Cóż, definiujesz funkcje, które zwracają wartości, wolałbym używać kodu jak napisałem w moim pytaniu (jako deklaracji zmiennej), ale twoje rozwiązanie wystarczyłoby, gdyby nie użyto 'auto'. – Kiel

+0

Mogę usunąć auto, ale ty otagowałeś swoje pytanie C++ 11 i is_integral jest C++ 11 – aaronman

1

Można to zrobić za pomocą liczb całkowitych:

template <typename T, bool isIntegral = std::is_integral<T>::value> 
struct number_validator 
{ 
    typedef WhatEverType type; 
}; 

template <typename T> 
struct number_validator<T, true> 
{ 
    typedef WhatEverTypeInt type; 
}; 

Druga specjalizacja zostanie wybrany, jeśli jest liczbą całkowitą, ale nie wiem co jeśli jest to zmiennoprzecinkowy lub inny typ.

Powiązane problemy