Какой смысл знать, является ли объект целым или нет, или это тип класса или нет?

14

Здравствуйте, я видел много таких примеров на Cppreference.com:

std::is_class<T>
std::is_integral

И так далее. Я знаю, если я запускаю код, например, я получаю trueили false. Но какой в ​​этом смысл? Например, зная, что объект имеет тип класса или нет?

#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';
}

Выход:

true
true
false
false
  • Я искал во всем для реального примера использования этого ( is_class, is_integral, is_arithmetic...) Но все учебники показывают только безнадежную пример: только trueили false.

  • Может ли кто-нибудь помочь мне с небольшим полезным примером использования этих шаблонов?

Рами Йен
источник
1
Простой пример std::copy. Что, если типы to std::copyявляются «простыми», например, массивом intили char? Вы бы использовали memcpy, верно? Так как же сказать: «Если тип простой, используйте memcpy, иначе используйте« медленный »цикл»?
PaulMcKenzie

Ответы:

17

Это не для записи в консоль, это точно.

В более широком смысле вы спрашиваете: в чем смысл черт типа?

Ответ - шаблонное метапрограммирование . Например, я могу создать шаблонную специализацию, которая делает одно для целочисленных типов, а другое - для нецелых типов.

Аарон Буллман имеет простое введение в типовые черты , как и Яцек здесь .

По моему мнению, большинство использования этих вещей будет найдено в реализациях классных функций и классов и утилит (т.е. в библиотеках) как часть фонового механизма, который заставляет все это работать.

Дальнейшее чтение:

Правильный ответ на этот первый пример дает превосходный пример того, когда черты полезны:

Например, реализация std::copyможет использовать std::memcpyвнутренне вместо явного цикла, когда итераторы являются указателями на POD. Это может быть достигнуто с SFINAE.

Гонки легкости на орбите
источник
Например, вы имеете в виду, что я могу использовать их для отключения некоторых экземпляров шаблонов для определенного типа, например, логично отключить шаблонную функцию Power<T>или класс, когда тип аргумента не является целочисленным, скажем, std :: string?
Рами Йен
1
@RamiYen, да, это называется SFINAE .
Крис
7

Это для шаблонного метапрограммирования. Когда вы не знаете, какой тип (ы) конечный пользователь перейдет в шаблон. Иногда он сообщает об ошибках, иногда специализируется на передаваемых типах. Иногда это комбинация.

Примеры, представленные на cppreference.com (например, https://en.cppreference.com/w/cpp/types/is_enum ), сильно упрощены и просто показывают, как использовать черту нестандартным образом. Вы почти никогда не использовали бы эти черты непосредственно в простой (не шаблонной функции или классе).

Ричард Криттен
источник