A volte è necessario confrontare la lunghezza di una stringa con una costante.
Per esempio:È valido "strlen()" in fase di compilazione?
if (line.length() > 2)
{
// Do something...
}
Ma sto cercando di evitare l'uso di costanti "magici" nel codice.
solito utilizzare tale codice:
if (line.length() > strlen("[]"))
{
// Do something...
}
è più leggibile, ma non efficiente a causa della chiamata di funzione.
Ho scritto funzioni template come segue:
template<size_t N>
size_t _lenof(const char (&)[N])
{
return N - 1;
}
template<size_t N>
size_t _lenof(const wchar_t (&)[N])
{
return N - 1;
}
// Using:
if (line.length() > _lenof("[]"))
{
// Do something...
}
In una build di rilascio (VisualStudio 2008) produce codice abbastanza buono:
cmp dword ptr [esp+27Ch],2
jbe 011D7FA5
E la cosa buona è che il compilatore non include il "[]" stringa nell'output binario.
È un ottimizzazione specifica del compilatore o è un comportamento comune?
probabilmente si potrebbe utilizzare un modello per tutti i tipi di array, qualcosa di mentire in questo modo: 'template size_t _lenof (const T (e) [N]) {return N - 1; } ', dovrebbe funzionare come il tuo esempio. –
@Evan Teran: buona idea, ma queste funzioni hanno senso solo per le stringhe (array di char/wchar_t) a causa della terminazione di '\ 0'. La tua funzione funzionerà per int [10] e restituirà 9 - Non penso che abbia senso;) – Dmitriy
@Dmitriy: anzi –