Domanda

Qual è il modo più semplice e meno invadente per indicare al compilatore, sia per mezzo di compilatore opzioni, #defines, typedefs, o modelli, che ogni volta che dico T, voglio dire T const? Io preferirei non fare uso di un preprocessore esterno. Dal momento che io non uso la parola chiave mutable, che sarebbe accettabile per riutilizzare per indicare lo stato mutevole.

Modifica Dal momento che l'intento di questa era sbagliata tutto (e dato che non ero in giro per qualche ora per chiarire), lascia che ti spieghi. In sostanza, voglio solo sapere quali sono disponibili per la manipolazione del sistema di tipo in fase di compilazione sistemi. Non mi importa se questo crea non standard, cattivo, impossibile da mantenere, il codice inutile. Non ho intenzione di usarlo in produzione. E 'solo una curiosità.

Soluzioni possibili (non ottimali) finora:

// 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);
È stato utile?

Soluzione

Prendere una fonte C ++ compiler aperta e modificarlo.

Credo che la ragione principale per i downvotes è che la gente pensa che si sta cercando di modificare C ++. Dite loro invece si sta creando un nuovo linguaggio denominato "C-const" come un progetto universitario.

Personalmente penso che sia un'idea interessante - è possibile ottenere tutti i tipi di prestazioni e leggibilità utili derivanti tipi immutabili -. Basta guardare la maggior parte dei linguaggi funzionali

Altri suggerimenti

Anche se si è in grado di fare questo (che ho il sospetto che non sei), pensare ad altre persone che leggono il vostro codice. Essi non sono in grado di capire che tutto è const e di conseguenza non sono in grado di capire il codice.

Stai cercando di dire al compilatore, o di raccontare agli altri la lettura o utilizzando il tuo codice? Il compilatore non farà molto qualcosa di diverso solo perché un tipo definito dall'utente è const utilizzato. In realtà, non fa altro che cambiare il set di metodi (definiti dall'utente o implicite) che possono essere utilizzati con tale oggetto. A sua volta, che possono consente al compilatore di dedurre alcune ottimizzazioni sulla rappresentazione in fase di esecuzione.

Per i tipi di class / struct, si può chiarire questo punto sia il compilatore e gli utenti, semplicemente facendo ogni const membro:

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!
}

Vorrei consigli contro questo. Se si riesce a raggiungere te obiettivo chiunque (voi compresi dopo un po 'di tempo) è sorpreso quando legge il codice e si comporta diverso da quello che si aspetta.

Si prega di aggiungere il modificatore const pianura visibile per tutti ovunque sia necessario. Il vostro codice sta per essere tariffa lettura più spesso allora che sta per essere scritto!

Si potrebbe mantenere lo standard di codice C ++ e mettere a punto un ulteriore livello di controllo del tipo.

Una macro MUTABLE vuoto potrebbe servire come un suggerimento per il const checker . const esplicita può essere ancora necessaria in luoghi per rendere il codice di compilazione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top