2013-04-25 8 views
6

Il modo più semplice per fare questa domanda è con un certo codice:puntatore cast ad un array di dimensioni fisse in istruzione return

struct Point 
{ 
    int x; 
    int y; 
    int z; 

    int* as_pointer() { return &x; }  // works 
    int (&as_array_ref())[3] { return &x; } // does not work 
}; 

as_pointer compilazioni, as_array_ref non lo fa. Un cast sembra essere in ordine ma non riesco a capire la sintassi appropriata. Qualche idea?

+1

Quindi vuoi che il compilatore faccia finta che 'x' sia, in effetti, una matrice di tre' int's? Non c'è alcuna garanzia che questo funzionerà; i compilatori possono aggiungere padding tra i membri dei dati in modi diversi dal modo in cui dispongono gli array. –

risposta

7

trovo che tipi di array sono più facili da affrontare con un typedef:

typedef int ints[3]; 

Allora la vostra as_array_ref devono essere scritti in modo che &as_array_ref() == &x.

sintassi seguenti sono possibili:

  1. pianura cast di tipo C da int* a ints*:

    ints& as_array_ref() { return *((ints*)(&x)); }

  2. C++ stile reinterpret_cast (suggerito da @ Mike Seymour - vedi anche la sua risposta). Si è spesso considerato una pratica migliore in C++:

    ints& as_array_ref() { return *reinterpret_cast<ints*>(&x); }

  3. Fusioni da int& a ints& che è leggermente più breve, ma (per me) meno intuitivo:

    ints& as_array_ref() { return reinterpret_cast<ints&>(x); }

+0

Funziona, grazie! SO non mi permette di accettare per altri 3 minuti però ... –

+0

Cool, felice di poterti aiutare;) – Antoine

+2

Preferirei vedere uno 'stile reinterpret_cast' in C++ per rendere più ovvio che qualcosa di losco sta accadendo. I cast in stile C sono entrambi pericolosi e difficili da cercare. –

2

I pensa che quello che stai cercando di fare sarebbe più facile (e più chiaro/pulito) con un sindacato.

+0

Anche un ottimo suggerimento, grazie. Normalmente li evito quindi il pensiero non mi è nemmeno passato per la testa! –

+0

Non sono sicuro dell'ottimizzazione: in entrambi i casi se i campi struct e gli array hanno una diversa spaziatura/allineamento non funzionerà. Quindi, a meno che non mi sbagli, entrambe le soluzioni sono pericolose. – Antoine

4

Il cast è necessario reinterpretare un riferimento ad una variabile come un riferimento ad un array è:

reinterpret_cast<int(&)[3]>(x); 

Essere consapevoli del fatto che l'utilizzo di questo dà un comportamento indefinito; probabilmente funzionerà su qualsiasi implementazione ragionevole, ma non c'è alcuna garanzia che non ci sarà il padding tra i membri della classe, mentre gli array non sono riempiti.

Problemi correlati