Witaj Widziałem wiele takich przykładów w Cppreference.com:
std::is_class<T>
std::is_integral
I tak dalej. Wiem, że jeśli uruchomię kod, na przykład otrzymuję true
lub false
. Ale jaki jest w tym sens? np. wiedząc, że obiekt jest typu klasy czy nie?
#include <iostream>
#include <type_traits>
struct A {};
class B {};
enum class C {};
int main()
{
std::cout << std::boolalpha;
std::cout << std::is_class<A>::value << '\n';
std::cout << std::is_class<B>::value << '\n';
std::cout << std::is_class<C>::value << '\n';
std::cout << std::is_class<int>::value << '\n';
}
Wyjście:
true
true
false
false
Rozglądałem całym dla prawdziwego przykład za pomocą tego (
is_class
,is_integral
,is_arithmetic
, ...) Ale wszystkie samouczki pokazać tylko beznadziejny przykład: tylkotrue
lubfalse
.Czy ktoś mógłby mi pomóc z małym przydatnym przykładem przy użyciu tych szablonów?
std::copy
. Co jeśli typystd::copy
są „proste”, takie jak tablicaint
lubchar
? Użyłbyśmemcpy
, prawda? Jak więc powiedzieć „Jeśli typ jest prosty, użyj memcpy, w przeciwnym razie użyj„ wolnej ”pętli?Odpowiedzi:
To na pewno nie do pisania na konsoli.
Mówiąc szerzej, pytasz: jaki jest sens cech typu?
Odpowiedzią jest metaprogramowanie szablonu . Na przykład mogę utworzyć specjalizację szablonu, która robi jedną rzecz dla typów integralnych, a drugą dla typów niecałkowitych.
Aaron Bullman ma proste wprowadzenie do cech typu , podobnie jak Jacek tutaj .
Moim zdaniem, większość zastosowań tych rzeczy zostanie zakopana w implementacjach fajnych funkcji oraz klas i programów narzędziowych (tj. W bibliotekach) jako część maszyn w tle, która sprawia, że wszystko działa.
Dalsza lektura:
odpowiedź prawej strony na pierwszy z nich daje doskonały przykład tego, kiedy cechy są przydatne:
źródło
Power<T>
lub klasy szablonów, gdy typ argumentu nie jest całkiem, powiedzmy std :: string?Jest przeznaczony do programowania meta szablonów. Gdy nie masz pojęcia, jakiego typu użytkownik końcowy przejdzie do szablonu. Czasami ma to na celu zgłaszanie błędów, a czasem specjalizowanie się w przekazywanych typach. Czasami jest to kombinacja.
Przykłady widoczne na cppreference.com (np. Https://en.cppreference.com/w/cpp/types/is_enum ) są bardzo uproszczone i pokazują, jak używać tej cechy w nietypowy sposób. Prawie nigdy nie użyłbyś tych cech bezpośrednio w prostej (funkcji lub klasie innej niż szablon).
źródło