Сделать все типы постоянными по умолчанию в С++
Каков самый простой и наименее навязчивый способ указать компилятору, будь то с помощью параметров компилятора, #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 может служить подсказкой для проверки константы. Явная константа может по-прежнему нуждаться в местах для компиляции кода.