Betrachten Sie den folgenden Code ein:Ausweichfunktion mit Auslassungspunkten: Können wir die Größe des Parameterpakets erzwingen?
#include <utility>
#include <iostream>
struct S {
template<typename T, typename... A>
auto f(A&&... args) -> decltype(std::declval<T>().f(std::forward<A>(args)...), void()) {
std::cout << "has f(int)" << std::endl;
}
template<typename>
void f(...) {
std::cout << "has not f(int)" << std::endl;
}
};
struct T { void f(int) { } };
struct U { };
int main() {
S s;
s.f<T>(42); // -> has f(int)
s.f<U>(42); // -> has not f(int)
// oops
s.f<T>(); // -> has not f(int)
}
Da der dritte Aufruf f
Arbeiten im gezeigten Beispiel ganz gut, auch wenn die Anzahl der Argumente ist falsch, denn es ist überhaupt für die Ausweichfunktion nicht falsch ist.
Gibt es eine Möglichkeit, die Anzahl der Argumente zu erzwingen, wenn eine Ellipse auf diese Weise beteiligt ist?
Ich meine, kann ich zur Kompilierzeit überprüfen, dass die Größe der Argumente Liste genau 1
ist, egal ob die Hauptfunktion oder der Fallback gewählt wird?
Gute Lösungen sind auch diejenigen, die nur die erste Template-Funktion beinhalten und wegen der Größe des Parameter-Packs zu Hard-Fehlern anstatt zu Soft-Fehlern führen.
Natürlich kann es mit mehreren Techniken gelöst werden, ohne variadic Argumente zu verwenden. Als Beispiel: int
/char
Dispatching auf interne Template-Methoden; explizit die Liste der Argumente angeben; was auch immer ...
Die Frage ist nicht über alternative Ansätze, das zu tun, ich kenne sie bereits.
Es ist nur zu wissen, ob ich hier etwas Grundlegendes vermisse oder es ist nicht möglich und das ist alles.
... warum genau brauchen Sie das? Man sollte meinen, dass das Erzwingen von Endbenutzern, Dummy-Argumente zu übergeben, ein schreckliches API-Design ist. –
@ T.C. Meinetwegen. Ich habe etwas mit einer Kollegin versucht, und Zweifel entstanden. Nur neugierig, es ist nicht für Produktionssoftware gedacht. Das eigentliche Problem ist größer und nicht geeignet für ein besseres Beispiel, um Post auf SO zu sein. – skypjack
'Gibt es eine Möglichkeit, die Anzahl der Argumente zu erzwingen, wenn eine Ellipse auf diese Weise beteiligt ist?': Nicht wirklich, nein. Variadische Argumente haben nur die Operationen 'va_start',' va_end' und 'va_list'. – AndyG