Mehrdeutige Überladung bei variantenlosen Vorlagen ohne Argumente

9

Verwandte:

Betrachten Sie dieses Paar variadischer Vorlagen:

%Vor%

Das funktioniert und kompiliert. Wie aber schreibe ich es ohne den ersten Template-Parameter?

Klingt trivial? Nun, das habe ich mir gedacht. :-) Lassen Sie uns einige Ideen betrachten.

Idee # 1:

%Vor%

Wird nicht funktionieren ... Als ich das versuchte, hatte ich Spezialisierung im Sinn, aber beim zweiten Gedanken funktioniert das nicht so.

Im ursprünglichen Beispiel habe ich zwei verschiedene Vorlagen für Überladungen erstellt, wobei ich zuerst 1 Vorlagenparameter und dann 2 oder mehr Vorlagen genommen habe. Keine Zweideutigkeiten und keine Spezialisierung. bekomme ich es richtig?

Idee # 2:

%Vor%

Funktioniert offensichtlich nicht, da All<rest...> mit rest... leer ist, wird nicht zu einem Aufruf einer Nicht-Template-Funktion erweitert.

Idee # 3:

Lassen Sie uns die Lösung ein wenig neu erstellen.

%Vor%

Dies ist ein No-Go, weil All (c) mehrdeutig wäre. Daher muss ich einen 0-Arg-Fall und einen & gt; 0-Arg-Fall haben ... Oder was ist mit einem 1-Arg-Fall und einem & gt; 1-Arg-Fall?

Idee # 3.5:

%Vor%

Yup, funktioniert, aber enthält copypasta (einfach in diesem Fall aber könnte größer sein!), daher würde ich sagen, es ist nicht besser als das, womit ich angefangen habe. Nur ein weiterer Workaround.

Idee # 4:

Versuchen wir # 1, aber mit Klassen anstelle von Funktionen.

%Vor%

Das sieht vielversprechend aus, da ich Klassen spezialisieren kann. Aber hey, was ist es?

  

sorry, unimplemented: kann "rest ..." nicht in eine Argumentliste mit fester Länge erweitern

War das nicht ein GCC 4.4-Ding? Ich bin auf MinGW GCC 4.6.1 (tdm-1).

Wie auch immer, sollte ich denken, dass ich so eine elementare Sache nicht einfach machen kann? Ist es erforderlich, die Problemumgehung mit einem zusätzlichen Dummy-Vorlagenparameter zu verwenden, um diese Aufgabe zu erfüllen?

Oder gibt es eine einfache, korrekte Variante, um den Null-Argument-Fall anzugeben , der funktionieren würde?

    
Kos 01.11.2011, 22:40
quelle

2 Antworten

3

Da in diesem Fall die Template-Parameter nicht typisiert sind, Wenn wir eine Funktion mit Standardvorlagenargument wie dem Anschließend kann Dummy Parameter gespeichert werden:

%Vor%

Ich bin mir jedoch nicht sicher, ob das immer anwendbar ist. Für einen allgemeineren Fall könnte std::enable_if oder ein ähnlicher Versand erforderlich sein (Dies wird den Code allerdings etwas langwierig machen.)

    
Ise Wisteria 02.11.2011, 18:30
quelle
1

Sieht so aus, als ob Ihre Frage der folgenden ähnelt: Kompilierungsfehler bei der Funktion der rekursiven Variadic-Vorlage

Dort gibt es zwei Antworten, die funktionieren sollten; eine, die deine # 3,5 ist und die zweite ist eine, die du nicht hast.

    
Jared Grubb 02.11.2011 03:47
quelle