PDA

View Full Version : [C++] Typo template come parametro di una funzione con argomento array


biowep
05-11-2014, 18:07
Salve, ho trovato in giro questa classe molto interessante ma non capisco la dichiarazione del costruttore:

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()
};

Si tratta di una classe in grado di gestire stringhe literal type.

Quello che volevo sapere è il significato di:
template<std::size_t N>
constexpr str_const(const char (&a)[N]) {}

Non capisco né il template ne l'argomento della funzione.

WarDuck
06-11-2014, 16:38
In soldoni in C una stringa è un'array di char... MA c'è un ma...


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;
}


Penso che quel costruttore sia in grado di accettare solo stringhe dichiarate nel primo modo in maniera da riconoscere la dimensione a tempo di compilazione.

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:


... funzione( tipo (&a)[N] )


Se usi a[N] anziché (&a)[N] mi sa che non funziona...

C/C++ riescono sempre a sorprendere :D.

biowep
07-11-2014, 07:37
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ò.