Какой смысл знать, является ли объект целым или нет, или это тип класса или нет? - PullRequest
13 голосов
/ 06 ноября 2019

Здравствуйте. Я видел много таких примеров на 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.

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

Ответы [ 2 ]

17 голосов
/ 06 ноября 2019

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

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

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

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

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

Дополнительная информация:

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

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

7 голосов
/ 06 ноября 2019

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...