Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 16
  1. #1

    [C++] Template per array di dati generici

    Se mi viene richiesto di definire una classe Array come contenitore di "dati generici", posso fare uso dei template?

    La domanda deriva dal fatto che la richiesta "dati generici" non è molto definita, ma purtroppo non ho modo di chiarirla ulteriormente.

    Se intende di definire metodi e costruttori per vari tipi di dato (o tutti) come credo, è corretto sfruttare i template?

    O negli attributi dovrei inserire diversi puntatori (ad una qualsivoglia "testa" dell'array) a seconda del tipo di dato richiesto...?
    Quest'ultima opzione mi sembra un po' improbabile/contorta.

  2. #2
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Si. Del resto std::vector e std::array sono costruiti usando template.
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  3. #3
    Originariamente inviato da shodan
    Si. Del resto std::vector e std::array sono costruiti usando template.
    Grazie mille a te.

  4. #4
    Originariamente inviato da shodan
    Si. Del resto std::vector e std::array sono costruiti usando template.
    Scusa ho un'altra domanda...è possibile verificare il tipo che si è scelto per il template, durante l'esecuzione?

    Ad esempio se il mio tipo template si chiama T, è possibile fare una cosa come:

    if(<T>==int) //so che questa non è possibile quindi cerco appunto un'alternativa

  5. #5
    Originariamente inviato da December_
    Scusa ho un'altra domanda...è possibile verificare il tipo che si è scelto per il template, durante l'esecuzione?

    Ad esempio se il mio tipo template si chiama T, è possibile fare una cosa come:

    if(<T>==int) //so che questa non è possibile quindi cerco appunto un'alternativa
    Puoi fare una cosa del genere usando la specializzazione parziale dei template, ma non vedo dove il codice di un array generico abbia bisogno di specializzazioni parziali... puoi scrivere tutto in maniera completamente generica senza alcun problema.
    Amaro C++, il gusto pieno dell'undefined behavior.

  6. #6
    Originariamente inviato da MItaly
    Puoi fare una cosa del genere usando la specializzazione parziale dei template, ma non vedo dove il codice di un array generico abbia bisogno di specializzazioni parziali... puoi scrivere tutto in maniera completamente generica senza alcun problema.
    Sai cosa il problema è che l'array potrebbe contenere sia char che int, per dire, quindi metodi come un banale ordinamento dovrebbero essere implementati diversamente: ho provato a fare un overloading (o una specializzazione -non so come si chiami in questo caso perchè non mi intendo di template), ma mi dà errore e dice che non è permesso.

  7. #7
    Originariamente inviato da December_
    Sai cosa il problema è che l'array potrebbe contenere sia char che int, per dire, quindi metodi come un banale ordinamento dovrebbero essere implementati diversamente
    Perché diversamente? L'algoritmo è sempre lo stesso...
    Amaro C++, il gusto pieno dell'undefined behavior.

  8. #8
    Beh se devo ordinare in ordine crescente dei char uso la strcmp diversamente per dei numeri userei i normali > / <.

  9. #9
    Originariamente inviato da December_
    Beh se devo ordinare in ordine crescente dei char uso la strcmp diversamente per dei numeri userei i normali > / <.
    No. Se il tuo contenitore è un contenitore di char, allora ogni char è un singolo elemento, e si ordinano con i normali < e >; se il tuo contenitore invece deve essere un contenitore di stringhe, allora dovrebbe essere un contenitore di array di char (ovvero, ciascun elemento è un array di char); tuttavia, usare un array di char come parametro template complica un po' diverse cose, e quello che normalmente si fa è incapsulare l'array di char in una classe string.
    Ma a questo punto non è necessario che il container faccia alcunché di speciale: basta che la classe string implementi un suo operatore di confronto (<) personalizzato che internamente faccia il confronto con la strcmp. La funzione di ordinamento userà l'operatore <, che sul tipo string richiamerà l'operatore personalizzato.
    Amaro C++, il gusto pieno dell'undefined behavior.

  10. #10
    Sì infatti davo per scontato che fossero possibili anche array di char, scusate (la richiesta dice: dati di lunghezza variabile, perciò...) . E in effetti per uno che sa quasi niente di template e poco di classi è un po' difficile quel che hai scritto , ma proverò a implementarlo

    Solo un chiarimento:
    quello che normalmente si fa è incapsulare l'array di char in una classe string.
    Significa che userei una classe string di "appoggio", la quale sarebbe derivata della classe array?

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.