Variadic Templates: Parameter Pack speichern und später verwenden



  • Hi zusammen

    ich möchte ein Parameter Pack für die spätere Verwendung speichern. Das forwarden in ein tuple funzt bereits. Derzeit scheitere ich an dem Aufruf einer Funktion mit dem "entpackten" Parameter Pack.

    template<typename ...Args>
    void foobar( int32_t, Args ... )
    {
    }
    
    template<typename... Args>
    class Dummy
    {
    public:
        Dummy( Args ... args ) : Arguments( std::forward<Args>( args )... ) {}
    
        void call()
        {
            auto f = std::bind(&foobar<Args...>, std::placeholders::_1, std::forward<Args>( Arguments )... );
            f( 3, Arguments );
        }
        std::tuple<Args...> Arguments;
    };
    
    

    Ich glaube der Compiler scheitert hier am std::forward, da ich dort ein tuple übergebe, während foobar aber ein Parameter-Pack erwartet...



  • @It0101 sagte in Variadic Templates: Parameter Pack speichern und später verwenden:

    der Compiler scheitert

    Error C00666: ich bin gescheitert



  • error: no matching function for call to 'forward<const char*>(std::tuple<const char*, const char*, double>&)'
    auto f = std::bind(&foobar<Args...>, std::placeholders::_1, std::forward<Args>( Arguments )... );

    template argument deduction/substitution failed:
    cannot convert '((Dummy<const char*, const char*, double>)this)->Dummy<const char, const char*, double>::Arguments' (type 'std::tuple<const char*, const char*, double>') to type 'const char*&'
    auto f = std::bind(&foobar<Args...>, std::placeholders::_1, std::forward<Args>( Arguments )...





  • template<typename ...Args>
    void foobar( int32_t, Args ... args )
    {
        expand( args ... );
    }
    
    
    template<typename... Args>
    class Dummy
    {
    public:
        Dummy( Args ... args ) : Arguments( std::forward<Args>( args )... ) {}
    
        void call()
        {
            auto f_unpack = [](Args const&... args) { foobar( 1, args...); };
            std::apply( f_unpack, Arguments );
        }
        std::tuple<Args...> Arguments;
    };
    

    Danke. Funzt 🙂


Anmelden zum Antworten