Отказ от ответственности: я не эксперт по C ++ и плохо знаком с концепциями C ++. Поэтому следующий ответ может немного сбить с толку, но я думал об этой концепции в другом контексте и думаю, что некоторые из пунктов здесь могут иметь отношение.
Вы не совсем точно сказали, что должна отражать концепция, за исключением примера, что она должна охватывать целочисленные типы и типы с плавающей запятой. Но с более теоретической, концептуальной точки зрения «арифметика» могла бы применяться гораздо шире - даже несмотря на то, что слово арифметика подразумевает, что речь идет о числах.
Интуитивно можно было ожидать, что концепция будет передавать следующее:
Рассматриваемый тип поддерживает основные арифметические операции +
, -
, *
и /
, и тип результата этих операций такой же, как и тип операндов. Судя по быстрому веб-поиску, эта идея формализована примерно так:
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", безусловно, была бы интересной, но с множеством оговорок. Трудно сформулировать концепцию четко, чтобы ее можно было, например, также применить к комплексным числам или подобным структурам. И если кто-то попытался определить это, он, безусловно, также захотел бы охватить другие алгебраические структуры, такие как группы или кольца (например, для матриц или многочленов) или даже векторные пространства ...
По крайней мере, некоторые люди пробовали это: быстрый поиск в Интернете выявил Techcnical Report: Fundamental Algebraic Concepts in Concept-Enabled C ++, в котором рассматриваются некоторые из этих идей, включая арифметику, и указываются связанные с этим трудности. Однако это с 2006 года - могут быть новые исследования, основанные на концепциях, которые нашли свое отражение в стандарте.
person
Marco13
schedule
24.09.2019
std::is_arithmetic
. Вы можете использовать это, чтобы написать свою собственную концепцию. - person NathanOliver   schedule 23.09.2019std::is_arithmetic_v
вместо концепцийstd::integral
иstd:floating_point
приведет к тому, что компилятор не будет рассматривать эти концепции как более ограниченные версии арифметической концепции. Это описано в справочнике по C ++. - person Adam Bucior   schedule 23.09.2019