Существуют ли технические ограничения, препятствующие встроенным элементам иметь статические элементы? - PullRequest
3 голосов
/ 08 января 2012

Я считаю это ужасным:

std::numeric_limits<int>::max()

И очень жаль, что я не мог бы написать это:

int::max

Да, есть INT_MAX и друзья. Но иногда вы имеете дело с чем-то вроде streamsize, который является синонимом для неопределенного встроенного, поэтому вы не знаете, следует ли вам использовать INT_MAX или LONG_MAX или что-то еще. Существуют ли технические ограничения, которые не позволяют ввести в язык что-то вроде int::max? Или просто никто кроме меня не заинтересован в этом?

Ответы [ 3 ]

4 голосов
/ 08 января 2012

Примитивные типы не являются типами классов, поэтому у них нет статических членов, вот и все.

Если вы делаете их типами классов, вы изменяете основы языка (хотя думать об этом не будет проблемой из соображений совместимости, больше похоже на головную боль для стандартных ребят, чтобы точно определить, какие члены добавить к ним).

Но что более важно, я думаю, что никтоно вы заинтересованы в этом :);лично я не нахожу numeric_limits таким ужасным (на самом деле, это довольно C ++ - иш - хотя многие могут утверждать, что часто то, что является C ++ - иш выглядит ужасным: P).


В целом,Я бы сказал, что это обычный «каждая функция начинается с минус 100 баллов» балл;в статье рассказывается о C #, но это еще более актуально для C ++, который уже обладает множеством языковых возможностей и тонкостей, сложным стандартом и множеством поставщиков компиляторов, которые могут наложить вето:

Один из способов сделатьэто через понятие «минус 100 баллов».Каждая функция начинается в лунке на 100 пунктов, что означает, что она должна оказать значительное положительное влияние на весь пакет, чтобы она стала языковой.Некоторые функции являются хорошими функциями для языка, но они не достаточно хороши, чтобы сделать его языком.

Даже если бы предложение было тщательно подготовлено кем-то другим, оно все равно потребовало бынастало время, чтобы комитет по стандартизации рассмотрел и обсудил его, и он, вероятно, был бы отклонен, поскольку это было бы дублированием материала, который уже возможен без проблем.

2 голосов
/ 08 января 2012

На самом деле существует несколько проблем:

  1. встроенные типы не являются классами в C ++
  2. классы не могут быть расширены новыми членами в C ++
  3. при условии, что реализация должна была предоставить определенных «участников»: какие?Есть много других атрибутов, которые вы, возможно, захотите найти для типа, и использование черт позволяет их добавлять.

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

namespace traits {
    template <typename T> constexpr T max() {
        return std::numeric_limits<T>::max();
    }
}

int m = traits::max<int>();

using namespace traits;
int n = max<int>();
0 голосов
/ 08 января 2012

Почему вы не используете std::numeric_limits<streamsize>::max()? Что касается того, почему это функция (max ()) вместо константы (max), я не знаю. В моем собственном приложении я создал свой собственный тип num_traits, который предоставляет максимальное значение в виде статической константы вместо функции (и предоставляет значительно больше информации, чем numeric_limits).

Было бы неплохо, если бы они определили некоторые константы и функции для самого "int", как в C # есть int.MaxValue, int.MaxValue и int.Parse (string), но это просто не то, что решил комитет C ++.

...