Сделать все типы постоянными по умолчанию в С++

Каков самый простой и наименее навязчивый способ указать компилятору, будь то с помощью параметров компилятора, #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);

Ответы

Ответ 1

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

Я думаю, что основной причиной downvotes является то, что люди думают, что вы пытаетесь изменить С++. Скажите им, вместо этого вы создаете новый язык под названием "C-const" в качестве университетского проекта.

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

Ответ 2

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

Ответ 3

Вы пытаетесь рассказать компилятору или рассказать другим людям, читающим или использующим ваш код? Компилятор не будет делать ничего другого, только потому, что используется определенный пользователем тип 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!
}

Ответ 4

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

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

Ответ 5

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

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