проверить, подписана ли переменная с помощью is_signed - PullRequest
0 голосов
/ 17 февраля 2019

Я хочу проверить, подписана ли переменная.Я нашел шаблон класса с именем is_signed , но не могу его использовать, так как я новичок в C ++.Как я могу проверить, что переменная подписана?

#include <iostream>
#include <cmath>

int main() {
    // the following short initialization is on purpose
    short price {10u};
    std::cout << std::is_signed<price>::value << '\n';
    return 0;
}

Ответы [ 3 ]

0 голосов
/ 17 февраля 2019

is_signed - как и многие другие структуры, это способ проверки типа , но не переменной .вы можете использовать decltype, чтобы получить базовый тип ваших переменных.

std::cout << std::is_signed<decltype(price)>::value << '\n'; //-> 1

Также - is_signed определяется в <type_traits>, а не <cmath>.


, как уже упоминалось в комментариях;если вы намерены просто посмотреть, является ли переменная положительной или отрицательной , вам не понадобятся какие-либо библиотечные утилиты.

Для получения этой информации используйте price > 0 или price < 0 соответственно.Это, конечно, операции только во время выполнения.

0 голосов
/ 17 февраля 2019

реализация is_signed может быть чем-то вроде

template<bool IsArithmetic, typename T> struct is_signed_impl : bool_constant<T(-1) < T(0)>
    {};

template<typename T> struct is_signed_impl<false, T> : false_type
    {};

template<typename T> struct is_signed
        : is_signed_impl<is_arithmetic_v<T>, T>
    {};

переменная шаблона T в is_signed<T>, наконец, используется в T(-1) < T(0), который предназначен для приведения.Если T - нетипичный аргумент, такой как price, приведение не является правильно сформированным.

0 голосов
/ 17 февраля 2019

Аргументы к шаблонам классов должны быть типами.Если у вас есть переменная, и вы хотите получить ее тип, вы можете использовать decltype:

std::cout << std::is_signed<decltype (price)>::value << '\n';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...