我正在尝试学习C++11中的可变参数模板。我有一个类,基本上是
我使用了
以下是代码:
std::array
的包装器。我想能够将函数对象(理想情况下是lambda)传递给成员函数,然后将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;
}
所以我的问题(如代码中所示)是如何以一种通用于 N
的方式将 data
的条目传递到函数 func
中?
奖励问题:是否可以摆脱在主函数中进行的不美观的转换,并直接传递lambda表达式?
func
? - jrokoperator () &&
。很不可能,但仍然有可能。 - Andy Prowlstd
中的 indices 相当的东西?您是否知道一个解释它如何工作的链接?顺便说一句,感谢您的回答。 - Dandata[Is]
)并展开它。关于你的例子,不,你不能那样做,包扩展只能在某些上下文中使用,而那不是一个合法的上下文。 - Andy Prowl