Po co wiedzieć, czy obiekt jest całką, czy nie, czy jest typem klasy, czy nie?

14

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ę truelub 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: tylko truelub false.

  • Czy ktoś mógłby mi pomóc z małym przydatnym przykładem przy użyciu tych szablonów?

Rami Yen
źródło
1
Prosty przykład std::copy. Co jeśli typy std::copysą „proste”, takie jak tablica intlub char? 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?
PaulMcKenzie

Odpowiedzi:

17

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:

Na przykład implementacja std::copymoże używać std::memcpywewnętrznie zamiast jawnej pętli, gdy iteratory są wskaźnikami na POD. Można to osiągnąć za pomocą SFINAE.

Lekkość Wyścigi na orbicie
źródło
Masz na myśli na przykład, że mogę ich użyć do wyłączenia niektórych wystąpień szablonów dla określonego typu, na przykład logiczne jest wyłączenie funkcji Power<T>lub klasy szablonów, gdy typ argumentu nie jest całkiem, powiedzmy std :: string?
Rami Yen
1
@RamiYen, Tak, to się nazywa SFINAE .
Chris
7

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).

Richard Critten
źródło