Ich weiß, dass die Sprachspezifikation eine teilweise Spezialisierung der Funktionsvorlage verbietet .
Ich würde gerne wissen, warum es das verbietet. Sind sie nicht nützlich?
template<typename T, typename U> void f() {} //allowed!
template<> void f<int, char>() {} //allowed!
template<typename T> void f<char, T>() {} //not allowed!
template<typename T> void f<T, int>() {} //not allowed!
template<typename T, typename U> void f(T t, U u) {}
auchtemplate<> void f(int t, char u) {}
erlaubt.Antworten:
AFAIK, das in C ++ 0x geändert wurde.Ich denke, es war nur ein Versehen (wenn man bedenkt, dass man den partiellen Spezialisierungseffekt immer mit ausführlicherem Code erzielen kann, indem man die Funktion als
static
Mitglied einer Klasse platziert).Sie können den entsprechenden DR (Fehlerbericht) nachschlagen, falls vorhanden.
EDIT : Wenn ich das überprüfe, finde ich, dass andere das auch geglaubt haben, aber niemand kann eine solche Unterstützung im Standardentwurf finden. Dieser SO-Thread scheint darauf hinzudeuten, dass eine teilweise Spezialisierung von Funktionsvorlagen in C ++ 0x nicht unterstützt wird .
EDIT 2 : nur ein Beispiel dafür, was ich unter "Platzieren der Funktion als
static
Mitglied einer Klasse" verstanden habe:quelle
Nun, Sie können wirklich keine Teilfunktions- / Methodenspezialisierung durchführen, aber Sie können eine Überladung durchführen.
Es ist der Weg, aber ich weiß nicht, ob es dich zufriedenstellt.
quelle
Im Allgemeinen wird aufgrund von Problemen mit der Überlastung nicht empfohlen, Funktionsvorlagen überhaupt zu spezialisieren. Hier ist ein guter Artikel aus dem C / C ++ Users Journal: http://www.gotw.ca/publications/mill17.htm
Und es enthält eine ehrliche Antwort auf Ihre Frage:
quelle
Da Sie Klassen teilweise spezialisieren können, können Sie einen Funktor verwenden:
quelle
()()
Syntax loszuwerden .