Отказ от ответственности: я не эксперт по 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 года - возможно, появятся более новые исследования, основанные на концепциях, которые нашли свое отражение в стандарте.