2012-02-05 14 views
5

Mi chiedevo se qualcuno sa quali sono i limiti sull'operatore di conversione/typecast?Ci sono dei limiti sui tipi nell'operatore typecast?

Così, per esempio, possono avere i seguenti operatori di override:

class Test { 
    operator int() { return 0; }; 
    operator int*() { return nullptr; }; 
} 

Per una funzione regolare, mi potrebbe anche avere un puntatore di tipo array. Per esempio.

int (*MyFunc())[4] { return nullptr; }; 

Tuttavia, non so come fare la stessa cosa per l'operatore di conversione (o se è ancora legale per farlo). Ho provato alcune varianti e VS2010 e nessuno funziona. (Come :)

operator int (*())[4] { return nullptr; }; 
operator int(*)[4]() { return nullptr; }; 

non sono sicuro se questa è una limitazione in VS2010 o se v'è un limite generale sui tipi che possono essere utilizzati nella operatore di conversione. Ho provato a cercare lo standard online senza fortuna. Qualcuno sa? Prima che qualcuno chieda "perché vorresti farlo?", È per il codice generato automaticamente. Sebbene non preveda di ottenere il puntatore sull'ingresso dell'array, mi piacerebbe essere in grado di produrre il codice se è legale in C++.

risposta

3

Sì, ci sono restrizioni. La limitazione che hai riscontrato con gli array è dovuta alla grammatica della lingua. La specifica grammatica per un operatore di conversione (e parenti) è la seguente:

 
§12.3.2 
conversion-function-id: 
    operator conversion-type-id 
conversion-type-id: 
    type-specifier-seq conversion-declarator[opt] 
conversion-declarator: 
    ptr-operator conversion-declarator[opt] 

§7.1.6 
type-specifier: 
    trailing-type-specifier 
    class-specifier 
    enum-specifier 
trailing-type-specifier: 
    simple-type-specifier 
    elaborated-type-specifier 
    typename-specifier 
    cv-qualifier 
type-specifier-seq: 
    type-specifier attribute-specifier-seq[opt] 
    type-specifier type-specifier-seq 
trailing-type-specifier-seq: 
    trailing-type-specifier attribute-specifier-seq[opt] 
    trailing-type-specifier trailing-type-specifier-seq 

lascio come esercizio per il lettore a guardare a tutti quelli, ma non è possibile specificare una matrice come il tipo direttamente. (. Si precisa solo in dichiarazioni) Per fortuna, però, un typedef-name è permesso (attraverso il typename-specifier), e perché un typedef è una sorta di dichiarazione, gli array vi lavorano:

struct Test { 
    typedef int operator_type[4]; 

    operator operator_type*() { return nullptr; }; 
}; 

Per farla breve, usa un typedef e puoi usare qualunque tipo desideri.

+0

Grazie. Questo ha risposto esattamente alla mia domanda. –

+0

Commento downvote? – GManNickG

6

Si dovrebbe per lo più utilizzare typedef in costrutti duri, anche ottenuto la sintassi sbagliata,

operator Type() {}

Userò typedef s se

typedef int (*foo())[4]; 
typedef int(*bar)[4]; 

utilizzando il typedef

operator foo() { return nullptr; } // qui stai cercando di convertireDa 210 a "function" che restituisce il puntatore all'array di 4 int, che è ovviamente errato.

operator bar() { return nullptr; } // vostra seconda conversione è valida, però, dal momento che si sta convertendo al nullptrpuntatore a schiera di 4 int s

+0

Sì, speravo di non usare typedef ma immagino che non ci sia altra scelta. –

Problemi correlati