Domanda

Vorrei definire all'interno di una classe una costante il cui valore è la massima possibile int. Qualcosa di simile a questo:

class A
{
    ...
    static const int ERROR_VALUE = std::numeric_limits<int>::max();
    ...
}

Questa dichiarazione non riesce a compilare con il seguente messaggio:

  

numeric.cpp: 8: errore: 'std :: :: numeric_limits max ()' non possono apparire in una costante espressione   numeric.cpp: 8: errore: una chiamata di funzione non può apparire in una costante espressione

capisco perché questo non funziona, ma due cose sembrano strano per me:

  1. Mi sembra una decisione naturale per utilizzare il valore di espressioni costanti. Perché i progettisti di linguaggi decidono di fare max () di una funzione non permettendo questo uso?

  2. Le rivendicazioni spec a 18.2.1 che

      

    Per tutti i membri dichiarati static const nel modello numeric_limits, specializzazioni definisce questi valori in modo tale che essi sono utilizzabili come espressioni costanti integrali.

    non significa che dovrei essere in grado di utilizzarlo in mio scenario e non è vero contraddice il messaggio di errore?

Grazie.

È stato utile?

Soluzione

Mentre lo standard corrente manca il supporto qui, per i tipi integrali Boost.IntegerTraits ti dà il tempo di compilazione costanti const_min e const_max.

Il problema nasce dal §9.4.2 / 4 :

  

Se un membro di dati statici è integrale const o tipo di enumerazione const, la dichiarazione nella definizione della classe può specificare un costante inizializzatore che deve essere un'espressione costante intera (5.19). In tal caso, l'elemento può apparire in espressioni costanti integrali.

Si noti che aggiunge:

  

L'utente deve ancora essere definito in un ambito spazio dei nomi se viene utilizzato nel programma e la definizione ambito dello spazio dei nomi non devono contenere un inizializzatore.

numeric_limits Come altri già menzionati min() e max() semplicemente non sono espressioni costanti integrali, cioè compilazione costanti di tempo.

Altri suggerimenti

si presenta come un po 'di un difetto ...

In C ++ 0x, numeric_limits avrà tutto segnato con constexpr, che significa che sarà in grado di utilizzare min() e max() come costanti in fase di compilazione.

Si desidera:

#include <limits>

struct A {
static const int ERROR_VALUE;
}; 

const int A::ERROR_VALUE = std::numeric_limits<int>::max();

Mettere la classe / struttura in un colpo di testa e la definizione in un file cpp.

E non contraddice, perché max non è definito static const. E 'solo una funzione di membro static. Funzioni non possono essere const e funzioni membro statiche non possono avere un const attaccato all'estrema destra o.

C'è anche un double max() nella doppia versione dei limiti, e in C ++ 03 che non avrebbe funzionato a dire static double const max = .... Quindi, per essere coerente, max() è una funzione per tutte le versioni del modello limite.

Ora, è noto che max() non essere in grado di essere utilizzato in quel modo è male, e C ++ 0x risolve già esso rendendolo una funzione constexpr, permettendo l'uso proposto.

  • cercherò di rispondervi quanto ho capito dalla tua domanda:

1- Se si desidera un int const static nel vostro programma per essere inizializzato con una funzione:

int Data()
{
 return rand();
}

class A
{
public :
    static const int ee;
};
const int A::ee=Data();

Questo funziona su VS 2008

2- Se si desidera ottenere il numero massimo e minimo per un determinato tipo di dati, quindi utilizzare queste definizioni INT_MAX, INT_MIN, LONG_MAX e così via ..

3- Se tuttavia è necessario utilizzare questi tipo di modello WRT, poi codificare i modelli da soli

template<>
int MaxData()
{
 return INT_MAX;
}

e

template<>
long MaxData()
{
 return LONG_MAX ;
}

e li chiamano in questo modo

int y=MaxData<int>();

4 e se siete solo a che fare con i tipi di binari rappresentato solo, quindi utilizzare questo:

template <class T>
T MaxData(){
    return ~(1<<((sizeof(T)*8)-1));
}

e questo

template <class T>
T MinData(){
    return (1<<((sizeof(T)*8)-1));
}

Spero che questo può aiutare ..

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