Passando std :: array como argumentos da função variadic do modelo
Eu estou tentando aprender sobre modelos variadic em C ++ 11. Eu tenho uma classe que é basicamente um wrapper em torno de umstd::array
. Eu quero ser capaz de passar objetos de função (idealmente lambdas) para uma função de membro e, em seguida, ter os elementos dostd::array
passou como parâmetros do objeto de função.
Eu usei umstatic_assert
para verificar se o número de parâmetros corresponde ao comprimento da matriz, mas não consigo pensar em uma maneira de passar os elementos como argumentos.
Aqui está o código
#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;
}
Então, minha pergunta (como indicado no código) é como se pode passar as entradas dedata
para a funçãofunc
de uma forma que é genérico comN
?
Pergunta bônus: É possível acabar com a conversão inestética parastd::function
no principal e passar em um lambda diretamente?