我想创建一个函数,通过一次调用更改元组内的多个值。
template<class... Args>
class EventN {
public:
std::tuple<Args...> mArgs;
EventN(Args... args) : mArgs(args) {}
EventN() {}
template<size_t N> void set(typename std::tuple_element<N-1,Tuple>::type value) {
std::get<N-1>(mArgs) = value; //I use N-1, to start from '1'
}
};
上面的 set 函数按照我的预期工作:
auto event = new EventN<String,int>();
event->set<1>("testEvent");
event->set<2>(12);
现在,我想将功能扩展到:
event->set<1,2>("testEvent", 12);
我怎样才能做到这一点?有没有办法制作std::tuple_element<N-1,Tuple>::type
可变参数?
最佳答案
尝试这样的事情:
template <int ...N, typename ...Args>
void set_all(Args &&... args)
{
int dummy[] = { (set<N>(std::forward<Args>(args)), 0)... };
static_cast<void>(dummy); // unused
}
这是有效的,因为不同的包是同步扩展的。这要求所有包都具有相同的大小,这是在编译时强制执行的。
虚拟数组和喜剧逗号运算符只是一种为了副作用而不关心它们的值而评估所有表达式的低级方法。
这是一个完整的小演示:
#include <iostream>
#include <utility>
template <int N, typename T> void set(T && t)
{
std::cout << "Setting " << N << " => " << std::forward<T>(t) << "\n";
}
template <int ...N, typename ...Args>
void set_all(Args &&... args)
{
int dummy[] = { (set<N>(std::forward<Args>(args)), 0)... };
static_cast<void>(dummy);
}
int main()
{
set_all<2, 51, 1>("Hello", 100, true);
}
观察到此时对整数的值没有限制;此约束仅在您使用整数作为元组索引时出现。
关于c++ - 如何使用 variadic size_t 模板将多个 std::tuple_element 分配为函数参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20844519/