Який сенс дізнатися, чи є об’єкт інтегральним чи ні, чи є класовим типом чи ні?


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. Що робити, якщо типи std::copy"прості", як масив intабо char? Ви б використовували memcpy, правда? Так як ви скажете "Якщо тип простий, використовуйте memcpy, інакше використовуйте" повільний "цикл"?
PaulMcKenzie

Відповіді:


17

Це не для запису на консоль, це точно.

Ви ширше запитуєте: у чому сенс типних рис?

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

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

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

Подальше читання:

Відповідь праворуч на цьому першому дає чудовий приклад, коли риси корисні:

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


Отже, ви маєте на увазі, наприклад, я можу використовувати їх для відключення деяких примірників шаблонів для конкретного типу, наприклад, логічно відключити шаблон-функцію Power<T>або клас, коли тип аргументу не є інтегральним, скажімо, std :: string?
Рамі Єн

1
@RamiYen, Так, це називається SFINAE .
chris

7

Це для мета-програмування шаблонів. Якщо ви не маєте уявлення, які типи (типи) кінцевий користувач перейде в шаблон. Іноді доводиться повідомляти про помилки, іноді - спеціалізуватися на виданих типах. Іноді це комбінація.

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.