我想创建一个函数,通过一次调用更改元组内的多个值.
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 variadic?
解决方法:
尝试这样的事情:
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,c11,variadic-templates 来源: https://codeday.me/bug/20190831/1773884.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。