14

¿Cuál es la forma más simple y menos molesta de indicar al compilador, ya sea mediante opciones de compilador, #define s, typedef s, o plantillas, que cada vez que digo T, realmente significa T const? Preferiría no hacer uso de un preprocesador externo. Como no utilizo la palabra clave mutable, sería aceptable reutilizar para indicar estado mutable.Hacer todos los tipos constantes por defecto en C++

Editar: Dado que la intención de esta se había equivocado por completo (y ya que no estaba en torno a un par de horas para aclarar), vamos a explicar. En esencia, solo quiero saber qué sistemas están disponibles para manipular el sistema de tipos en tiempo de compilación. No me importa si esto crea un código no estándar, malo, inmanejable e inútil. No voy a usarlo en producción. Es solo una curiosidad.

potenciales (subóptima) 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); 
+7

-1 por mala idea. – piotr

+0

No tenemos claro qué intenta lograr con esto. Seguramente no se trata solo de evitar escribir const tantas veces.O para preguntar de otra manera: ¿Puede decirnos qué espera lograr al tener estos tipos de const? Puede haber un mejor enfoque para su objetivo final. . – MtnViewMark

+1

@MtnViewMark: Honestamente, sentí curiosidad por saber qué medios están disponibles para manipular el sistema de tipos en tiempo de compilación. El ejercicio real probablemente no importa en lo más mínimo. Me sorprendió bastante que @piotr me bajara la votación. –

Respuesta

10

Tome un compilador C++ de código abierto y modifíquelo.

Creo que la razón principal para los downvotes es que la gente piensa que estás tratando de modificar C++. Diles que estás creando un nuevo idioma llamado "C-const" como proyecto universitario.

Personalmente, creo que es una idea interesante, puede obtener todo tipo de ganancias y legibilidad de tipos inmutables, simplemente busque en la mayoría de los lenguajes funcionales.

+0

+1 Esta es definitivamente la mejor respuesta hasta el momento, pero voy a dejar de aceptarla para dar otras respuestas la oportunidad de ponerme al día con la pregunta editada. –

+0

En realidad, dado que const puede eliminarse a través de const_cast, no puede obtener beneficios de rendimiento (a menos que su idioma modificado también deshabilite/modifique el operador const_cast) – tohava

1

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

Para class/struct tipos, puede hacer que esta claro tanto 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! 
} 
+1

Lo entendiste mal. Quiere dejar de escribir la palabra "const" en todos esos lugares y, sin embargo, hacer que C++ actúe como si la palabra estuviera allí. ejercicio inútil, por supuesto. De todos modos, creo que lo que él quiere es imposible. –

+0

Respondí lo que creo que podría ser su verdadero objetivo, ya que simplemente tratar de evitar el tipado const es desaconsejable y solo plantea la pregunta ¿por qué? He dejado un comentario sobre el OP pidiendo aclaraciones. – MtnViewMark

+0

@Stefan: Sí, ese es el punto. Por supuesto es inútil. Probablemente debería haber dejado en claro desde el principio que entiendo lo que estoy haciendo y que simplemente tengo curiosidad. –

2

Incluso si usted es capaz de hacer esto (y sospecho que usted no está), piense en otras personas que lean su código. No es probable que entiendan que todo es const y, como resultado, no es probable que entiendan su código.

+2

Esta es una actitud muy negativa. La investigación en lenguajes de programación es un campo de estudio completamente válido. Si desea realizar un cambio incremental a un idioma existente, * tiene que * hacer algo no estándar. Si todos tomaran su actitud, ningún lenguaje de programación cambiaría nunca. Un dialecto inmutable de C++ podría ser lo correcto para algunos problemas. Sospecho que no. Pero aplaudo el afiche por experimentar y aprender. – sigfpe

+0

Derecha. La edición del OP no estaba allí cuando presenté mi respuesta. No me di cuenta de que esta pregunta era sobre aprender/explorar los límites de C++ y/o las técnicas de extensión/programación no estándar. Estoy a favor de la experimentación y la investigación, solo quería enfatizar la importancia del código legible para la próxima persona que aparezca. ¡Gracias! -Mike –

+0

¡Genial! Todos estamos de acuerdo entonces. – sigfpe

0

No recomendaría esto. Si logra alcanzar su objetivo, cualquier persona (incluyéndolo después de un tiempo) se sorprende cuando lee su código y se comporta de forma diferente a lo que espera.

Agregue el modificador const llano visible para todos donde sea necesario. Su código se leerá más seguido de lo que se va a escribir.

+0

Tal vez, pero la falta de 'const' por defecto es un mal diseño significativo de C y C++ como lenguajes de programación. Sería mejor, sería mucho mejor, si 'const' fuera el predeterminado y tuvieras que decir explícitamente' var' o similar para obtener una variable. En realidad, la necesidad de distinguir constantes de variables surge tan a menudo que es una lástima que un punto * de puntuación no esté definido para él, como 'int m' (una constante!) Y' $ int m' (una variable). – thb

0

Puede mantener el código C++ estándar e idear una capa adicional de verificación de tipo.

Una macro MUTABLE vacía podría servir como una pista para const checker. Const explícito aún puede ser necesario en los lugares para hacer que el código compilar.

Cuestiones relacionadas