6

Ich habe eine lange Vorlage Funktionsdeklaration:Kann ich declltype() verwenden, um Code-Duplizierung bei expliziten Template-Instanziierungen zu vermeiden?

template <typename T> void foo(lots ofargs, goin here, andeven more, ofthese arguments, they just, dont stop); 

ohne Überlastung. und ich möchte es explizit instanziieren. Ich kann (für T sagen = int) schreiben:

template void foo<int>(lots ofargs, goin here, andeven more, ofthese arguments, they just, dont stop); 

Aber ich will wirklich nicht, dass lange Erklärung kopieren. Ich hätte mochte der Lage sein, zu sagen, so etwas wie:

template <typename T> using bar = decltype(foo<T>); 

und dann:

template bar<int>; 

nun die erste Zeile kompiliert (GCC 4.9.3), aber die zweite Linie doesn‘ t. Kann ich es irgendwie funktionieren lassen? Oder kann ich decltype() auf andere Weise verwenden, um das Kopieren der Deklaration für die Instanziierung zu vermeiden?

Hinweis: Ich habe absichtlich ein Beispiel verwendet, in dem Sie den Typ nicht nur aus den Argumenten ableiten können, da ich jede Lösung auch in diesem Fall unterstützen möchte.

Antwort

3

Sicher. Von [temp.explicit]:

Die Syntax für explizite Instanziierung ist:
        explizite-Instanziierung:
                extern opttemplateErklärung

[...] Wenn die explizite Instanziierung für eine Funktion oder Member-Funktion ist, die unqualifizierte Nummer in der Erklärung wird entweder ein Template-id sein oder, in dem alle Vorlage Argumente abgeleitet werden können, ein Vorlagenname oder Operator-Funktions-ID. [Anmerkung: Die Erklärung kann erklären, eine qualifizierte Nummer, in welchem ​​Fall die unqualifizierte Nummer der qualifizierten Nummer ein Template-id sein muss. -Endnote]

Wir brauchen eine Erklärung.Nehmen wir an, wir beginnen mit:

template <class T> void foo(T) { } 

können wir explizit über nur spezialisieren:

template void foo<char>(char); // template-id 
template void foo(int);   // or just template-name, if the types can be deduced 

Dies ist die gleiche wie geschrieben zu haben:

using Fc = void(char); 
using Fi = void(int); 

template Fc foo<char>; 
template Fi foo; 

die die gleiche wie mit ist geschrieben:

template <class T> using F = decltype(foo<T>); 

template F<char> foo<char>; 
template F<int> foo; 

Der Grund, warum template bar<int> nicht funktioniert, ist, dass es keine Deklaration ist. Du brauchst auch den Namen.

+0

Ich bearbeite die Frage, um sicherzustellen, dass Sie das Template-Argument für die Funktionsargumente nicht ableiten können, woran ich eigentlich interessiert war. Ich streute einfach ein T t für ein gutes Maß, nicht gemeint damit Sie es benutzen ... Wenn Ihre Antwort noch relevant ist, dann großartig. – einpoklum

+0

@einpoklum Das ist nicht im Entferntesten klar von der Frage, und warum denkst du, dass meine Antwort nicht relevant ist? – Barry

+0

Ich habe nicht gesagt, dass es irrelevant ist, ich hatte nur den Sinn (vor deinem letzten Schnitt), dass du dich vielleicht mehr darauf verlässt als du tatsächlich bist. – einpoklum