◐ Shell
clean mode source ↗

std::is_arithmetic — cppreference.com

Материал из cppreference.com

<tbody> </tbody>

template< class T > struct is_arithmetic;

(начиная с C++11)

std::is_arithmetic является UnaryTypeTrait.

Если T является арифметическим типом (то есть целочисленным типом или типом с плавающей запятой) или его cv-квалифицированной версией, предоставляет константу-элемент value равную true. Для любого другого типа value равна false.

Поведение программы, добавляющей специализации для std::is_arithmetic или std::is_arithmetic_v (начиная с C++17) не определено.

Параметры шаблона

Шаблон вспомогательной переменной

<tbody> </tbody>

template< class T > inline constexpr bool is_arithmetic_v = is_arithmetic<T>::value;

(начиная с C++17)

Унаследован от std::integral_constant

Константы элементы

true, если T это арифметический тип, false иначе
(public static константа-элемент)

Функции-элементы

преобразует объект в bool, возвращает value
(public функция-элемент)
возвращает value
(public функция-элемент)

Типы элементы

Тип Определение
value_type bool
type std::integral_constant<bool, value>

Примечание

Арифметические типы это встроенные типы, для которых определены арифметические операторы (+, -, *, /) (возможно, в сочетании с обычными арифметическими преобразованиями)

Специализации std::numeric_limits предоставляются для всех арифметических типов.

Возможная реализация

template< class T >
struct is_arithmetic : std::integral_constant<bool,
                                              std::is_integral<T>::value ||
                                              std::is_floating_point<T>::value> {};

Пример

#include <atomic>
#include <cstddef>
#include <type_traits>

class A {};

enum class B : int { e };

static_assert(
    std::is_arithmetic_v<bool>            == true  and
    std::is_arithmetic_v<char>            == true  and
    std::is_arithmetic_v<char const>      == true  and
    std::is_arithmetic_v<int>             == true  and
    std::is_arithmetic_v<int const>       == true  and
    std::is_arithmetic_v<float>           == true  and
    std::is_arithmetic_v<float const>     == true  and
    std::is_arithmetic_v<std::size_t>     == true  and

    std::is_arithmetic_v<char&>           == false and
    std::is_arithmetic_v<char*>           == false and
    std::is_arithmetic_v<int&>            == false and
    std::is_arithmetic_v<int*>            == false and
    std::is_arithmetic_v<float&>          == false and
    std::is_arithmetic_v<float*>          == false and
    std::is_arithmetic_v<A>               == false and
    std::is_arithmetic_v<B>               == false and
    std::is_arithmetic_v<decltype(B::e)>  == false and
    std::is_arithmetic_v<std::byte>       == false and
    std::is_arithmetic_v<std::atomic_int> == false
);

int main() {}

Смотрите также