Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    [C++] Templates multipli

    Ciao. Scusate il titolo, ma non sapevo che altro scrivere: mi spiego subito. Ho creato un template di classe che rappresenta delle matrici. Tutto ok, finché non ho testato le seguenti linee di codice:
    codice:
    Matrix<double> m1(3,3,1.); // Matrice 3x3 piena di 1.
    
    std::cout << 3. * m1 << std::endl; // Funziona (vedi ridefinizione dell'operatore *)
    std::cout << 3 * m1 << std::endl; // Non funziona (3 é int e non double)
    Per gli operatori esterni sono riuscito a risolvere utilizzando due parametri template. Ma per quelli esterni come fare? Vorrei chiaramente abilitare tutte le possibili combinazioni di tipi (visto che la classe funziona solo con tipi aritmetici): ha perfettamente senso sommare una matrice di int a una di double o una di std::complex a una di double o di int.

    Ps: Dubbio: std::complex é aritmetico, giusto?

    Grazie,
    R.
    K. L. Thompson
    You can't trust code that you did not totally create yourself.
    A. Bogk
    UNIX is user-friendly, it just chooses its friends.

  2. #2
    UP
    K. L. Thompson
    You can't trust code that you did not totally create yourself.
    A. Bogk
    UNIX is user-friendly, it just chooses its friends.

  3. #3
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381

    Re: [C++] Templates multipli

    Originariamente inviato da RooccoXXI
    ha perfettamente senso sommare una matrice di int a una di double o una di std::complex a una di double o di int.
    Dipende. Se sommi una matrice di double a una matrice di int ottieni una matrice di double, idem se la moltiplichi. Se invece sommi o moltiplichi) una matrice di int a una di double rimarrai con una matrice di double. E lo stesso vale con std::complex.
    Per farla breve con gli operatori che hai definito puoi solo operare su tipi omogenei.
    Se vuoi operare con tipi non omogenei è necessario usare un altro sistema (metaprogrammazione template).
    E' quello che ti avevo accennato tempo fa.

    std::complex ha operatori matematici, ma non rientra nei tipi riconosciuti da std::is_arithmetic<>. Tuttavia è possibile farlo digerire allo static_assert usando un apposito traits:

    codice:
    template <typename T>
    struct is_complex : public std::false_type {};
    
    template <typename T>
    struct is_complex<std::complex<T>> : public std::true_type {};
    
    static_assert(std::is_arithmetic<T>::value || is_complex<T>::value, "");
    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.

  4. #4

    Re: Re: [C++] Templates multipli

    Originariamente inviato da shodan
    Dipende. Se sommi una matrice di double a una matrice di int ottieni una matrice di double, idem se la moltiplichi. Se invece sommi o moltiplichi) una matrice di int a una di double rimarrai con una matrice di double. E lo stesso vale con std::complex.
    Per farla breve con gli operatori che hai definito puoi solo operare su tipi omogenei.
    Se vuoi operare con tipi non omogenei è necessario usare un altro sistema (metaprogrammazione template).
    E' quello che ti avevo accennato tempo fa.
    È proprio il problema che ho incontrato. Anche utilizzando due parametri template, quello restituito definisce il tipo. Quindi il tipo é definito dalla posizione rispetto all'operatore e non dal tipo con meno perdita di informazione.

    Puoi indicarmi qualche buona referenza su dove posso almeno capire i rudimenti della metaprogrammazione template?

    Grazie ancora per l'aiuto.

    Ps: Per i tipi omogenei la classe sembra funzionare alla grande!
    K. L. Thompson
    You can't trust code that you did not totally create yourself.
    A. Bogk
    UNIX is user-friendly, it just chooses its friends.

  5. #5
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Puoi indicarmi qualche buona referenza su dove posso almeno capire i rudimenti della metaprogrammazione template?
    E' un argomento a cui hanno dedicato un libro perché non è proprio facilissimo:
    http://www.amazon.com/Template-Metap.../dp/0321227255

    altrimenti vediti un po' di questi link.
    https://www.google.it/search?q=templ...ient=firefox-a

    Al di la di questo, gli operatori matematici disomogenei non puoi implementarli come membri della classe, ma come funzioni a se stanti (scordandosi la friendship per non impazzire con i prototipi).
    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.

  6. #6
    Originariamente inviato da shodan
    E' un argomento a cui hanno dedicato un libro perché non è proprio facilissimo:
    http://www.amazon.com/Template-Metap.../dp/0321227255

    altrimenti vediti un po' di questi link.
    https://www.google.it/search?q=templ...ient=firefox-a

    Al di la di questo, gli operatori matematici disomogenei non puoi implementarli come membri della classe, ma come funzioni a se stanti (scordandosi la friendship per non impazzire con i prototipi).
    Mmmh. Opto per i link perché ho solo 10 giorni per affrontare l'argomento (vacanze e poi si ricomincia scuola). Magari il libro sarà per l'estate. ; ). Grazie comunque.

    Immaginavo che avessero scritto un libro a parte, perché nei libri di base non viene nemmeno accennato. Comunque la classe per ora funziona visto che per ora la uso io conosco le sue limitazioni e quindi va bene lo stesso.

    Sai in che linguaggio é scritto MATLAB?
    K. L. Thompson
    You can't trust code that you did not totally create yourself.
    A. Bogk
    UNIX is user-friendly, it just chooses its friends.

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 © 2025 vBulletin Solutions, Inc. All rights reserved.