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

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

Решение

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

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

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

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

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

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

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

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

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

Другие вопросы по тегам