Jak napisać szablon klasy, który akceptuje tylko szablony liczbowe (int
, double
, float
itd.) Jako szablon?Szablon klasy dla typów liczbowych
Odpowiedz
Możesz użyć cechy typu std::is_arithmetic
. Jeśli chcesz tylko umożliwić konkretyzacji klasy z takiego typu, używać go w połączeniu z std::enable_if
:
#include <type_traits>
template<
typename T, //real type
typename = typename std::enable_if<std::is_arithmetic<T>::value, T>::type
> struct S{};
int main() {
S<int> s; //compiles
S<char*> s; //doesn't compile
}
Dla wersji enable_if
, który jest łatwiejszy w obsłudze i darmowego dodatku disable_if
, bardzo polecam czytania this wonderful article (lub cached version) w tej sprawie.
Możesz zostawić 'typename Dummy ='. Ponadto bardzo polecam używanie tutaj [Wheels] (https://bitbucket.org/martinhofernandes/wheels), czyni to kod znacznie prostszym: 'template
@ KonradRudolph, Masz rację, dzięki. Dodam link do jego wpisu 'enable_if' do dalszego czytania. – chris
@KonradRudolph, Usunięcie 'Dummy' spowodowało, że nie został skompilowany, ale nie jestem z nim zbyt doświadczony, więc nie mogę powiedzieć, jak to powinno wyglądać, poza tym. Zdałem sobie jednak sprawę, że mogę usunąć bezsensowne imię. – chris
znalazłem komunikaty o błędach odbierane od podejścia template<typename T, typename = ...>
bardzo tajemniczym (VS 2015), ale okazało się, że static_assert
tego samego typu cecha działa również i pozwala mi podać komunikat o błędzie:
#include <type_traits>
template <typename NumericType>
struct S
{
static_assert(std::is_arithmetic<NumericType>::value, "NumericType must be numeric");
};
template <typename NumericType>
NumericType add_one(NumericType n)
{
static_assert(std::is_arithmetic<NumericType>::value, "NumericType must be numeric");
return n + 1;
}
int main()
{
S<int> i;
S<char*> s; //doesn't compile
add_one(1.f);
add_one("hi there"); //doesn't compile
}
Pewnie. Byłoby miło dodać tę wiadomość tutaj. – kyb
- 1. Unikaj metod rozszerzania .NET dla typów liczbowych?
- 2. Jak częściowo specjalizować szablon klasy dla wszystkich typów pochodnych?
- 3. specjalizująca szablon funkcji dla typów referencyjnych
- 4. Identyfikowanie typów liczbowych i tablicowych w numpy
- 5. Ograniczenie rodzajowe pasujące do typów liczbowych
- 6. Szablon klasy specjalizacja z klasy szablon
- 7. Włącz szablon tylko dla określonej klasy szablonów.
- 8. Specjalizacja metody klasy szablon
- 9. Szablon klasy C++
- 10. Szablon edytora ASP.NET MVC 2 dla typów wartości, int
- 11. Jak wpisywaćf szablon klasy?
- 12. szablon specjalizacji klasy szablonu
- 13. Szablon konstruktora klasy
- 14. Jaką cechę mogę użyć do "porównania rozmytego" typów liczbowych?
- 15. Brak typów liczbowych do agregacji - zmiana zachowania groupby()?
- 16. Jak wyodrębnić bity większych liczbowych typów danych Numpy
- 17. C++ varadic szablon terminacja klasy
- 18. C++ Szablon "typ klasy" Błędy
- 19. Przywróć domyślny szablon klasy C#
- 20. static_cast dla typów zdefiniowanych przez użytkownika
- 21. Specjalizacja szablonów dla wielu typów
- 22. Specjalizacja szablonów dla typów podstawowych
- 23. Szalony szablon C++ - szablon dostępu do poszczególnych atrybutów klasy
- 24. Jak wygenerować klasy @XmlRootElement dla typów podstawowych w XSD?
- 25. Szablon Django dla pętli
- 26. Szablon specjalizacyjny dla enum
- 27. przeciążeniem Funkcja szablonowe dla wszystkich typów String
- 28. Biblioteka typów typów danych dla C
- 29. qmake analiza zmiennych liczbowych
- 30. clang bug? przestrzeni nazw klasy szablon przyjaciel
@KonradRudolph Wykonaj chcesz również poprawić tytuł? Jestem zdezorientowany, jeśli OP naprawdę oznacza typy lub faktycznie oznacza stałe tych typów. – pmr
@ pmr Nie zrobiłem (ale zrobiłem to teraz), dobry połów. Jestem całkiem pewien, że OP oznacza typy, jeśli nie z innego powodu, że nie można używać typów nie-integralnych jako szablonów nie typu i że pytanie nie ma sensu na początku, gdy mówimy o szablonach nie typu. –
@KonradRudolph Tak, mam na myśli typy. – djWann