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:

    1. ohne Parameter
    2. mit T&&, U&&... und enable_if<!is_same_v<decay_t<T>, Properties>>
    3. mit T&&, U&&... und enable_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 😉


Anmelden zum Antworten