|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Member
Iscritto dal: Nov 2010
Messaggi: 211
|
[C++] Typo template come parametro di una funzione con argomento array
Salve, ho trovato in giro questa classe molto interessante ma non capisco la dichiarazione del costruttore:
Codice:
class str_const { // constexpr string private: const char* const p_; const std::size_t sz_; public: template<std::size_t N> constexpr str_const(const char (&a)[N]) : // ctor p_(a), sz_(N - 1) { } constexpr char operator[](std::size_t n) { // [] return n < sz_ ? p_[n] : throw std::out_of_range(""); } constexpr std::size_t size() { return sz_; } // size() }; Quello che volevo sapere è il significato di: Codice:
template<std::size_t N> constexpr str_const(const char (&a)[N]) {} |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: May 2001
Messaggi: 12843
|
In soldoni in C una stringa è un'array di char... MA c'è un ma...
Codice:
void main(void) { char stringa1[] = "pippo"; char* stringa2 = "pippo"; printf("Length: %u\n", sizeof(stringa1)); // stampa 6 (la lunghezza di pippo + terminatore) printf("Length: %u\n", sizeof(stringa1)); // stampa 4 o 8 (la dimensione di un ptr a 32 o 64 bit) return 0; } Dimensione che il compilatore usa come parametro implicito per costruire una funzione "concreta" a partire dal template. (In pratica puoi omettere la variabile template quando chiami il costruttore perché viene "inferita" dal parametro) C'è da dire che è la prima volta che vedo: Codice:
... funzione( tipo (&a)[N] ) C/C++ riescono sempre a sorprendere ![]() Ultima modifica di WarDuck : 06-11-2014 alle 16:42. |
![]() |
![]() |
![]() |
#3 |
Member
Iscritto dal: Nov 2010
Messaggi: 211
|
Sizeof di un array, avevo scoperto anche io che funzionava correttamente quando studiavo il C. Il C però non gestisce la dimensione dell'array (così mi hanno insegnato), per cui devo salvarla da qualche parte come costante. Ciò che volevo sapere é se posso usare questo trick. Se é una caratteristica standard del C/C++ o se dipende dal compilatore che uso.
Ho letto che l'argomento é una reference ad un array di char di dimensione N. Credo che in C++ si possa specificare la dimensione dell'array a cui si fa riferimento e quindi si commette un errore se si lega la variabile refetence ad un array di dimensione diversa. Non l'ho ancora verificato però. |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 19:31.