In C ++ 11 è possibile utilizzare Auto per aggirare i parametri void * nelle funzioni?

0

Se ho una funzione generica che prende un void * come parametro, Auto in C ++ 11 può aiutare a fermare qualsiasi cast errato di quel parametro?

Ad esempio, potremmo avere un sistema di eventi che invia eventi e un puntatore ad alcuni dati rilevanti per l'evento che invia.

void EventClass::SendEvent (eventTypeEnum eventType, void* eventData)
{
  int* castEventData = static_cast<int*> (eventData);

  //.. Do something  
}

Nell'esempio precedente, un eventType potrebbe essere inviato con eventData come float * e un altro come puntatore a una struttura. Il file static_cast presenterà un errore e causerà problemi.

C'è un modo in cui auto potrebbe essere usato per evitare questo problema.

Si prega di notare che questo è solo un esempio (non eccezionale se dispiace) per aiutarmi a capire le possibilità dell'auto e non un problema reale che ho.

    
posta Monkey 07.08.2014 - 00:53
fonte

1 risposta

4

No, ricorda che 'auto' è una funzione di compilazione del tempo: dice che il compilatore può dedurre il tipo di una variabile dal suo inizializzatore. Ad esempio, se il compilatore vede

auto i = 10;

può dedurre che i è un intero. O più utile, dato

auto it = c.begin();

dove c è una sorta di collezione, il compilatore può dedurre che it è un iteratore del sottotipo appropriato.

Qui la tua funzione dice semplicemente che eventData è un vuoto *, quindi è tutto il compilatore che deve andare avanti. Rilevare che in una particolare istanza hai passato un float * piuttosto che un int * è un problema di run time e auto non lo risolverà.

Penso che alcune lingue abbiano usato un 'auto' per un tipo di dati generico come 'Variant' di Microsoft, ma non è quello che fornisce l''auto' in C ++.

Sembra che tu abbia bisogno di supporto per Run Time Type Identification (RTTI), ma ciò presuppone comunque un certo vincolo su ciò che stai passando nella funzione. Se è veramente necessario essere in grado di passare qualsiasi cosa da un char * a un IncrediblyComplexStruct *, probabilmente si dovrà passare il tipo insieme al valore, possibilmente usando eventTypeEnum come suggerito da @RobertHarvey.

    
risposta data 07.08.2014 - 01:09
fonte

Leggi altre domande sui tag