Pregunta

¿Cuál es la forma más simple y menos molesto para indicar al compilador, ya sea por medio del compilador opciones, #defines, typedefs o plantillas, que cada vez que digo T, me T const realmente? Yo preferiría no hacer uso de un preprocesador externo. Puesto que yo no uso la palabra clave mutable, eso sería aceptable para cambiar la finalidad de indicar el estado mutable.

Editar Ya que la intención de esta era errónea completamente (y ya que no estaba en torno a un par de horas para aclarar), me explico. En esencia, sólo quiero saber qué opciones están disponibles para manipular el sistema de tipos en tiempo de compilación sistemas. No me importa si esto crea no estándar, malo, imposible de mantener, código inútil. No voy a utilizarlo en la producción. Es sólo una curiosidad.

(subóptimas) Posibles soluciones hasta ahora:

// 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);
¿Fue útil?

Solución

Tome una fuente de C ++ compilador abierta y modificarlo.

Creo que la razón principal de los downvotes es que la gente piensa que está tratando de modificar C ++. Dicen ellos en su lugar va a crear un nuevo lenguaje llamado "C-const" como un proyecto universitario.

En lo personal creo que es una idea interesante - se puede obtener todo tipo de rendimiento y facilidad de lectura ganancias de tipos inmutables -. Mirada justo en la mayoría de los lenguajes funcionales

Otros consejos

Incluso si usted es capaz de hacer esto (que sospecho que no lo son), pensar en otras personas que leen el código. No es probable que entender que todo es const y como resultado no es probable que entender su código.

¿Estás tratando de decirle al compilador, o decirle a la gente a leer o utilizar el código? El compilador no hacer nada muy diferente sólo porque un tipo definido por el usuario es const usado. Realmente, todo lo que hace es cambiar el conjunto de métodos (definidos por el usuario o implícita) que se pueden utilizar con ese objeto. A su vez, que puede permitir que el compilador para inferir algunas optimizaciones en la representación en tiempo de ejecución.

Para los tipos class / struct, se puede hacer esto en claro tanto para el compilador y los usuarios simplemente haciendo cada miembro 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!
}

I would advice against this. If you manage to achieve you goal anyone (including you after some time) is surprised when he reads your code and it behaves different than he expects.

Please add the const modifier plain visible for everyone wherever it's needed. Your code is going to be read fare more often then it's going to be written!

You could keep the code standard C++ and devise an extra layer of type checking.

An empty MUTABLE macro could serve as an hint for the const checker. Explicit const may still be needed at places to make the code compile.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top