Ho il seguente esempio in cui vengono utilizzati due parametri t1 e t2.Funzione modello variabile con più di due parametri
template<typename T>
bool Compare(T t1, T t2)
{
return t1 == t2;
}
template<typename T, typename... Args>
bool Compare(T t1, T t2, Args... args)
{
return (t1 == t2) && Compare(args...);
}
int main(void)
{
Compare(1, 1, "string", "string");
}
Funzione Confronta prende coppie di parametri che sono dello stesso tipo e possono essere confrontati. Due coppie vengono confrontate, quindi il pacchetto di parametri viene passato in modo ricorsivo fino a quando non vengono raggiunti gli ultimi due parametri. Per interrompere la ricorsione, utilizzo un'implementazione della funzione Confronta senza il pacchetto di parametri.
vorrei aggiungere il terzo t3 argomento così funzione Confronta dovrebbe essere simile a questo:
template<typename T>
bool Compare(T t1, T t2, T t3)
{
return t1 == t2 == t3;
}
template<typename T, typename... Args>
bool Compare(T t1, T t2, T t3, Args... args)
{
return (t1 == t2 == t3) && Compare(args...);
}
int main(void)
{
Compare(1, 1, 1, "string", "string", "string");
}
mi aspetto che questa funzione prende tre parametri di confronto, allora il prossimo tre sono trattati in modo ricorsivo. Quando provo a compilare questo codice ottengo il seguente errore:
>xxx\source.cpp(4): error C2446: '==': no conversion from 'const char *' to 'int'
1> xxx\source.cpp(4): note: There is no context in which this conversion is possible
1> xxx\source.cpp(10): note: see reference to function template instantiation 'bool Compare<const char*>(T,T,T)' being compiled
1> with
1> [
1> T=const char *
1> ]
1> xxx\source.cpp(15): note: see reference to function template instantiation 'bool Compare<int,const char*,const char*,const char*>(T,T,T,const char *,const char *,const char *)' being compiled
1> with
1> [
1> T=int
1> ]
1>xxx\source.cpp(4): error C2040: '==': 'int' differs in levels of indirection from 'const char *'
Come implementare questa funzione per confrontare i gruppi di tre parametri dello stesso tipo?
Per espandere sull'ultima riga: passando il c_str() di una stringa std contenente "stringa" come uno degli argomenti valuterebbe falsa, anche se tutte le stringhe dicono "stringa" - hanno posizioni diverse in memoria . Dovresti preferire l'utilizzo delle stringhe std (che include il wrapping di costanti stringa in esse) ogni volta che è possibile. –