Übergabe von std :: array als Argumente der variadischen Template-Funktion

Ich versuche, verschiedene Vorlagen in C ++ 11 kennenzulernen. Ich habe eine Klasse, die im Grunde ein Wrapper um ein iststd::array. Ich möchte in der Lage sein, Funktionsobjekte (im Idealfall Lambdas) an eine Mitgliedsfunktion zu übergeben und dann die Elemente derstd::array als Parameter des Funktionsobjekts übergeben.

Ich habe eine verwendetstatic_assert Um zu überprüfen, ob die Anzahl der Parameter mit der Länge des Arrays übereinstimmt, kann ich mir keine Möglichkeit vorstellen, die Elemente als Argumente zu übergeben.

Hier ist der Code

#include <iostream>
#include <array>
#include <memory>
#include <initializer_list>

using namespace std;

template<int N, typename T>
struct Container {
    template<typename... Ts>
    Container(Ts&&... vs) : data{{std::forward<Ts>(vs)...}} {
        static_assert(sizeof...(Ts)==N,"Not enough args supplied!");
    }

    template< typename... Ts>
    void doOperation( std::function<void(Ts...)>&& func )
    {
        static_assert(sizeof...(Ts)==N,"Size of variadic template args does not match array length");

        // how can one call func with the entries
        // of data as the parameters (in a way generic with N)
    }

    std::array<T,N> data;
};

int main(void)
{
    Container<3,int> cont(1,2,3);

    double sum = 0.0;
    auto func = [&sum](int x, int y, int z)->void{
        sum += x;
        sum += y;
        sum += z;
    };

    cont.doOperation(std::function<void(int,int,int)>(func));

    cout << sum << endl;

    return 0;
}

Also meine Frage (wie im Code angegeben) ist, wie man die Einträge von übergeben kanndata auf die Funktionfunc auf eine Art und Weise, die generisch ist mitN?

Bonus-Frage: Ist es möglich, die unansehnliche Bekehrung zu beseitigen?std::function in main und direkt in einem Lambda übergeben?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage