C++ Templatefunktion ohne Datenübergabe im Rumpf?

T_55

Lieutenant
Registriert
Feb. 2013
Beiträge
638
Hallo,

ich habe mal 2 Fragen zu Templates wo ich nicht so eindeutig eine klare Antwort finden konnte,

Frage 1: ich habe eine Funktion an die ich keine Daten übergeben muss aber dennoch als Templatefunktion brauche. Wenn eine Funktion nur in der Funktion selbst ein Datentyp benutzt, zB sizeof(T) oder Variablen nur in der Funktion definiert werden und dieser Datentyp inkl Variable NICHT im Funktionsrumpf als Parameter existiert, kann man dann trotzdem irgendwie eine Templatefunktion erstellen?
Klingt natürlich erstmal unlogisch denn der Compiler weiß ganz ohne Info ja beim Funktionsaufruf nicht mit welchem Datentyp er die Funktion bauen soll. aber was ist denn wenn die Datenübergabe gar nicht nötig ist sondern nur die Info eines Datentypes. Kann man irgendwie einer Funktion nur einen Datentyp übermitteln ohne Daten damit dann in der Templatefunktion die Datentypen stimmen? Oder übergibt man dann einfach eine unbenutzte Pseudo-Variable als Hilfskonstrukt für den Compiler?

Frage 2: Wie definiert sich denn genau der Gültigkeitsbereich eines Templates also wie lange ist zB die Zeile template <typename T> gültig? Nur für den nachfolgenden Funktionsrumpf+Funktionsinhalt? oder noch weiter im Code für weitere Funktionen? Wenn mehrere Templatefunktionen hintereinander stehen, kann man dann immer wieder T nehmen oder sollte man besser dann zur eindeutigen Zuordnung unterschiedliche Platzhalternamen vergeben wie T1 T2 T3 usw?

Gruß
 
Zu 1:
Klar geht das:

C++:
fcall<int>();

Das funktioniert überall.

Zu 2:
Die Sichtbarkeit ist auf die jeweilige Übersetzungseinheit begrenzt und jede Instanziierung erhöht mit hoher Wahrscheinlichkeit deinen Objectcode.
 
  • Gefällt mir
Reaktionen: T_55
Der Typ T ist für die gesamte Funktion gültig. Eine andere Funktion kann auch den Typ T benennen. Der hat dann aber nichts mehr mit dem T der ersten Funktion zu tun.

Beispiel:

Code:
#include <iostream>

template<class T>
std::size_t foo1(){
    return sizeof(T);
}

template<class T>
std::size_t foo2(){
    return sizeof(T) * 2;
}

int main(){
    std::cout << foo1<int>() << ", " << foo2<char>() << "\n";
}
https://godbolt.org/z/9Ta333dex
 
  • Gefällt mir
Reaktionen: T_55
Zurück
Oben