Parameter Pack Funktionsaufruf unschön
-
Hi zusammen
ich bastele aktuell an einem Aufruf mit Parameter Pack.
Das Minimalbeispiel sieht folgendermaßen aus:#include <iostream> #include <assert.h> class Properties { public: Properties() {} ~Properties() {} }; class FooBarClass { public: FooBarClass() {} ~FooBarClass() {} template <class... Args> bool startTest(Args&&... taskArgs) { return false; // Diese wird leider aufgerufen } template <class... Args> bool startTest( const Properties &props, Args&&... taskArgs ) { return true; // Diese Funktion soll aufgerufen werden } }; int main() { Properties props; FooBarClass fb; assert( fb.startTest( (const Properties &)props ) == true ); return 0; }
Wenn ich auf den Cast "(const Properties &)" im Aufruf verzichte, kommt die assertion. Mit Cast funktioniert es.
Ich finde das irgendwie unschön, weil ich vom Benutzer verlangen müsste, dass er sein Properties Objekt auf const-ref castet.Bekommt man das auch irgendwie eleganter hin, so dass man auf den Cast verzichten kann?
-
Was ist, wenn du die nicht-konstante Variante hinzufügst?
template <class... Args> bool startTest( Properties &props, Args&&... taskArgs ) { return startTest((const Properties &)props, taskArgs...); }
-
Du kannst drei
startTest
Templates* machen:- ohne Parameter
- mit
T&&, U&&...
undenable_if<!is_same_v<decay_t<T>, Properties>>
- mit
T&&, U&&...
undenable_if<is_same_v<decay_t<T>, Properties>>
Das unschöne daran ist natürlich die duplication zwischen 1 und 2. Das schöne daran ist dass du dabei explizit ganz genau die Regeln definieren kannst die du möchtest, und dich nicht auf irgendwelche vordefinierten partial-ordering Regeln verlassen musst.
Was besseres fällt mir jetzt auf die Schnelle nicht ein.
EDIT: * Ja, (1) ist natürlich kein Template
-
Der Hinweis von @Th69 hat schon mal funktioniert. Danke dafür
@hustbaer : mit deiner Antwort setze ich mich gerade auseinander.
Ich bin leider (noch) nicht so der Meta-Spezi, daher bin ich etwas überfordert.
mit enable_if hab ich noch nie gearbeitet, daher dauert das länger bis ich zu der Lösung was sagen kann