Есть ли типограф, проверяющий включение между типами? - PullRequest
0 голосов
/ 09 января 2019

Я ищу типограф, способный узнать, входит ли диапазон одного типа в другой. Typetrait, где is_included_in<T,U>::value равно true, когда каждое значение типа T может быть сохранено как значение типа U. Пример:

is_included_in<float,double>::value; // true
is_included_in<double,float>::value; // false
is_included_in<int,double>::value; // true
is_included_in<bool,long int>::value; // true
is_included_in<long long int,float>::value; // false

Есть ли что-то в Boost, способное сделать это? Или мне самому написать?

Примечание: я не использую C ++ 11 для совместимости.

Ответы [ 2 ]

0 голосов
/ 09 января 2019

Для основных целочисленных типов и типов с плавающей точкой вы можете сравнить их количество цифр следующим образом:

template <typename T, typename U>  
struct is_included_in
  : boost::integral_constant<bool,
      std::numeric_limits<T>::digits <= std::numeric_limits<U>::digits> { };

Это работает для всех ваших примерных дел. Единственная проблема заключается в том, что он дает true, например, <float, long>. Здесь помогает частичная специализация:

template <typename T, typename U,
  bool = boost::is_floating_point<T>::value && boost::is_integral<U>::value>
struct is_included_in
  : boost::integral_constant<bool,
      std::numeric_limits<T>::digits <= std::numeric_limits<U>::digits> { };

template <typename T, typename U>
struct is_included_in<T, U, true> : boost::false_type { };

Демонстрация в реальном времени: https://wandbox.org/permlink/NBXFOUK8fX9sxyfm.

0 голосов
/ 09 января 2019

Нет, вам придется сделать это самостоятельно.

При этом, если вы хотите использовать это, чтобы сделать арифметические преобразования безопасными по значению, Boost уже имеет numeric_cast, который достигает этого.

Так что, в зависимости от вашей цели, вам может не потребоваться черта.

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

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