Я пытаюсь узнать о вариативных шаблонах в C++ 11. У меня есть класс, который в основном является оберткой вокруг std::array
. Я хочу иметь возможность передавать функциональные объекты (в идеале lambdas) в функцию-член, а затем передавать элементы std::array
в качестве параметров объекта функции.Передача std :: array в качестве аргументов переменной вариационной функции
Я использовал static_assert
, чтобы проверить, что количество параметров соответствует длине массива, но я не могу придумать способ передать элементы в качестве аргументов.
Вот код
#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;
}
Так что мой вопрос (как указано в коде), как может один передать записи из data
на функцию func
таким образом, который является общим с N
?
Бонус Вопрос: Можно ли покончить с неприглядным преобразованием в std::function
в главном и передать в лямбда прямо?
Почему вы экспедиторская 'func' на сайте вызова? – jrok
@jrok: Ну, это в основном теоретическая вещь. Вызываемым объектом может быть rvalue, и он может иметь 'operator() &&'. Очень маловероятно, но все же возможно –
Теперь это тонкое. Ум показывает пример, где это важно? [Я не могу заставить его работать.] (Http://coliru.stacked-crooked.com/view?id=f65a8b7e2330253abae7aab3b75f0fb1-7063104e283ed82d51a6fde7370c6e59) (+1 кстати) – jrok