Ich möchte eine Template-Funktion schreiben, um Daten von einem Array in ein anderes Array zu kopieren. Ich will nur int
, double
und char*
(String) Arrays in meinem Programm behandeln.C++: Kann einen Parameter vom Typ 'char *' nicht mit einem Lvalue vom Typ 'double' in einer Template-Funktion mit dem Typ konditional initialisieren
template<typename T>
void copy_key(T *destination, int destination_index, T *source, int source_index){
if (typeid(T) == typeid(int) or typeid(T) == typeid(double)){
destination[destination_index] = source[source_index];
} else {
// char* case
strcpy(destination[destination_index], source[source_index]);
}
}
Wenn ich copy_key()
wie unten rufen, will ich Fehler: Kann nicht einen Parameter vom Typ ‚char *‘ mit einem L-Wert vom Typ ‚double‘ initialisieren.
int main(int argc, const char * argv[]) {
double from_array[3] = {1.0,2.0,3.0};
double to_array[3];
copy_key(to_array, 0, from_array, 2);
std::cout << to_array[0] << std::endl;
return 0;
}
Ich dachte, wenn T
double
ist, würde der andere Block nicht eingegeben werden. Meine Frage ist, wie man die Bedingung für den Schablonentyp in meinem Beispiel korrekt verwendet?
Der 'else' Block muss noch * kompiliert * werden.Die Auswahl 'if' erfolgt immer noch zur * Laufzeit *. Es sieht auch so aus, als ob eine Spezialisierung oder einfach nur Überladung ein besseres Design wäre, denke ich. –
Die Funktion muss in der Lage sein, als Ganzes zu kompilieren. Wenn Sie den Template-Parameter "by-hand" ersetzt haben, dh eine neue Standalone-Funktion erstellt haben (mit dem Template-Parameter T substituiert), würden Sie erwarten, dass er kompiliert wird? –