Будет ли концепция для арифметических типов в стандартной библиотеке C ++? - PullRequest
5 голосов
/ 23 сентября 2019

Я просматривал библиотеку понятий на C ++ ссылка , и я не смог найти концепцию для арифметических типов.Я также не смог найти его в p0898 .Я думаю, что такая концепция была бы очень полезна.Намеревался сделать:

template <typename T>
T some_function(T arg) requires std::integral<T> || std::floating_point<T>
{ /* functions body */ }

Я мог бы просто сделать:

template <std::arithmetic T>
T some_function(T arg)
{ /* functions body */ }

Я мог бы определить это сам, и это не будет трудно (например, template <typename T> concept arithmetic = std::integral<T> || std::floating_point<T>;), но вПо моему мнению, такое базовое понятие должно быть определено в стандартной библиотеке.Есть ли веская причина, почему ее там нет?Или есть предложение добавить его?

Ответы [ 2 ]

5 голосов
/ 23 сентября 2019

Есть ли веская причина, почему ее там нет?Или есть какое-либо предложение добавить его?

Нет предложения добавить его, но я бы ожидал увидеть комментарий NB, который просто предлагает template <typename T> concept arithmetic = std::is_arithmetic_v<T>::value;(который не гарантирует, что C ++ 20 будет иметь эту концепцию, просто, по крайней мере, она будет рассмотрена).

Стандартные концепции библиотеки были добавлены предложением Ranges и были обусловлены потребностями в алгоритмах дляопределенные понятия.integral часто появляется, но я думаю, что arithmetic никогда не появлялся, и поэтому его просто не добавили.Если вы посмотрите, скажем, N4382 (с начала 2015 года), вы увидите, что IntegralSignedIntegral и UnsignedIntegral) были там с самого начала ... тогда как даже FloatingPoint был добавлен позже.( P0631 , в июле 2019 года ... и даже в статье, в которой была добавлена ​​концепция с плавающей запятой, ничего не упоминалось о arithmetic)

Конечно, тогда возникает интересный вопрос о том, должно ли оно основываться на строгой характеристике типа или это должно быть template <typename T> concept arithmetic = integral<T> || floating_point<T>;, чтобы понятия integral и floating_pointсоставляет arithmetic.Вероятно?Может быть?

0 голосов
/ 24 сентября 2019

Отказ от ответственности: я не эксперт по C ++ и не очень хорошо знаком с концепциями C ++.Таким образом, следующий ответ может быть немного расстроенным, но я подумал об этой концепции в другом контексте и думаю, что некоторые из пунктов здесь могут иметь отношение.

Вы сделалине совсем точно сказать, что концепция должна передать, помимо примера, что она должна охватывать целочисленные типы и типы с плавающей точкойНо с более теоретической, концептуальной точки зрения, «арифметика» могла бы применяться гораздо шире - даже если слово «1007 * арифметика» подразумевает, что оно составляет около чисел .

Интуитивно можно ожидать, что концепция передаст следующее:

Рассматриваемый тип поддерживает основные арифметические операции, +, -, * и /,и тип результата этих операций совпадает с типом операндов.В быстром веб-поиске эта идея, похоже, формализована примерно так:

self operator+(self const& x, self const& y);
self operator−(self const& x, self const& y);
self operator∗(self const& x, self const& y);
self operator/(self const& x, self const& y);

Однако для правильной арифметики требуется больше:

  • , поэтому должно бытьзамыкание элементов при заданной операции
  • должен быть нейтральный элемент сложения (0)
  • должен быть нейтральный элемент умножения (1)
  • должен быть аддитивный обратный для каждого элемента (-x)
  • должен быть мультипликативный обратный для каждого элемента (/x - за исключением нейтрального элемента сложения ...)

Вы видите, что здесь открыта банка с червями.Эти ограничения уже трудно или невозможно применить для целочисленных типов, поскольку может не быть аддитивного обратного, особенно для unsigned типов.Для типов с плавающей точкой особые случаи быстро выходят из-под контроля из-за +/-inf и, самое главное: NaN.Все это еще даже не учитывает ограниченную точность арифметики с плавающей запятой.


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


Таким образом, концепция арифметики, которая выходит за рамки утверждения, что это «либо float, либо int», безусловно, была бы интересна, но имеет много предостережений.Попытка сформулировать концепцию аккуратно, чтобы она могла, например, также применяться к комплексным числам или подобным структурам, затруднена.И , если кто-то попытался определить это, он, конечно, также хотел бы охватить другие алгебраические структуры, такие как группы или кольца (например, для матриц или полиномов) или даже векторных пространств ...

Некоторые люди пытались по крайней мере: быстрый веб-поиск показал Технический отчет: фундаментальные алгебраические концепции в концептуально-поддерживаемом C ++ , который рассматривает некоторые из этих идей, включая арифметику,и указывает на трудности, которые связаны с этим.Однако с 2006 года - возможно, появятся более новые исследования, основанные на концепциях, которые нашли свое отражение в стандарте.

...