Сделать все типы постоянными по умолчанию в C ++ - PullRequest
14 голосов
/ 04 мая 2010

Какой самый простой и наименее навязчивый способ указать компилятору, будь то с помощью параметров компилятора, #define s, typedef s или шаблонов, что каждый раз, когда я говорю T, я действительно имею в виду T const? Я бы предпочел не использовать внешний препроцессор. Поскольку я не использую ключевое слово mutable, его можно было бы повторно использовать для указания изменчивого состояния.

Редактировать: Поскольку намерение было ошибочным полностью (и так как я не был рядом в течение нескольких часов, чтобы уточнить), позвольте мне объяснить. По сути, я просто хочу знать, какие системы доступны для манипулирования системой типов во время компиляции. Мне все равно, если это создает нестандартный, плохой, не поддерживаемый, бесполезный код. Я не собираюсь использовать это в производстве. Это просто любопытство.

Потенциальные (субоптимальные) решения на данный момент:

// I presume redefinition of keywords is implementation-defined or illegal.
#define int int const
#define ptr * const
int i(0);
int ptr j(&i);

typedef int const Int;
typedef int const* const Intp;
Int i(0);
Intp j(&i);

template<class T>
struct C { typedef T const type; typedef T const* const ptr; };
C<int>::type i(0);
C<int>::ptr j(&i);

Ответы [ 5 ]

11 голосов
/ 04 мая 2010

Возьмите компилятор C ++ с открытым исходным кодом и измените его.

Я думаю, что основной причиной отрицательных голосов является то, что люди думают, что вы пытаетесь модифицировать C ++. Вместо этого скажите им, что вы создаете новый язык под названием «C-const» в качестве университетского проекта.

Лично я думаю, что это интересная идея - вы можете получить все виды производительности и читабельности от неизменяемых типов - просто посмотрите на большинство функциональных языков.

2 голосов
/ 04 мая 2010

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

1 голос
/ 04 мая 2010

Вы пытаетесь сообщить компилятору или другим людям, которые читают или используют ваш код? Компилятор не будет делать ничего другого просто потому, что используется пользовательский тип const. На самом деле все, что он делает - это изменяет набор методов (определенных или неявных), которые можно использовать с этим объектом. В свою очередь, может позволить компилятору вывести некоторые оптимизации на представление во время выполнения.

Для типов class / struct вы можете сделать это понятным как для компилятора, так и для пользователей, просто сделав каждый член const:

class Point {
    // An immutable Point data object
    public:
        Point(int ix, int iy): x(ix), y(iy) { }
        Point(const Point& p): x(p.x), y(p.y) { }

        Point add(const Point& p) const;
        int taxiDistance() const;
        // etc... all const members

        const int x, y; // const can only be init'd at construction time

     private:
        Point& operator=(const Point& p); // never implemented!
}
0 голосов
/ 08 октября 2014

Вы можете сохранить код стандарта C ++ и разработать дополнительный уровень проверки типов.

Пустой макрос MUTABLE может служить подсказкой для const checker . Явное const все еще может понадобиться в некоторых местах для компиляции кода.

0 голосов
/ 04 мая 2010

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

Пожалуйста, добавьте модификатор const, который будет виден всем, где это необходимо. Ваш код будет читаться чаще, чем будет написан!

...