C++ 什么';C+中的sva_arg()+;11变量模板?
我读过一些关于这个新的C++11特性的文章,但我不理解所有的东西(我是C++新手)。如何访问一个特定的参数,就像在C中使用C++ 什么';C+中的sva_arg()+;11变量模板?,c++,templates,c++11,clang,variadic-templates,C++,Templates,C++11,Clang,Variadic Templates,我读过一些关于这个新的C++11特性的文章,但我不理解所有的东西(我是C++新手)。如何访问一个特定的参数,就像在C中使用stdarg.h中的va_arg一样 template <typename ... Args> void f(Args ... args) { for(size_t i = 0; i < sizeof ...(args); i++) { // obviously, args...[i] didn't work... }
stdarg.h
中的va_arg
一样
template <typename ... Args>
void f(Args ... args)
{
for(size_t i = 0; i < sizeof ...(args); i++)
{
// obviously, args...[i] didn't work...
}
}
模板
无效f(参数…参数)
{
对于(大小i=0;i问题在于类型var=args[c]代码>,您为类型写什么?每个i
都有不同的类型,因此您不能像这样对循环使用
通常,通常的方法是使用递归
void f() { } //end loop
template<class FirstType, typename...Args>
void f(FirstType&& first, Args&&...rest) {
//do loop body
loop_body(std::forward<FirstType>(first)...)
//do next "iteration"
f(std::forward<Args>(rest)...);
}
公认的答案非常好,但这里有一个使用C++14通用lambdas的想法:
template <typename F>
void variadic_for_each(F) {}
template <typename F, typename Head, typename... Tail>
void variadic_for_each(Head&& head, Tail&&... tail, F f)
{
f(std::forward<Head>(head));
variadic_for_each(std::forward<Tail>(tail)..., f);
}
模板
每个(F){}的无效变量
模板
每个变量的无效变量(头和头,尾和尾,F)
{
f(标准:前进(头));
每个变量的变量(标准:正向(尾部)…,f);
}
用法示例:
template <typename... Ts>
void myFunc(Ts&&... vs)
{
variadic_for_each(std::forward<Ts>(vs)..., [](auto&& v)
{
// loop body
});
}
模板
无效myFunc(Ts&&…vs)
{
每个变量的变量(标准::正向(vs)…,[](自动和v)
{
//环体
});
}
您能再解释一下typedef char[]for_each
方法吗?您应该在for each
中添加一些void()
,以中断可能过载的运算符,
。或对于每个x{(无效)(模式)…,0}
。顺便说一句,声明器id是必需的。将包扩展传递给函数仅用于副作用是危险的,因为求值是不顺序的。(声明器id可能是不必要的,因为它不是声明,而是有效的表达式;函数强制转换表示法的一种形式。)我不推荐这个宏,因为它使用非C++的C99复合文字,而用这个别名模板制作这个可移植的C++非常容易。dyp这不是函数式强制转换表示法,因为它与语法(类型)表达式
–不匹配Johannes SchaubI认为,如果所有参数都具有相同的类型(T
),那么这个答案有最好的解决方案:基本上,创建一个局部std::vector x={{args}
位于f()的第一行,然后您可以迭代x[]
#define FOREACH_VARIADIC(EXPR) (int[]){((void)(EXPR),0)...,0}
template<typename...Args>
void f(Args&&...args) {
FOREACH_VARIADIC(loop_body(std::forward<Args>(args)));
}
template <typename F>
void variadic_for_each(F) {}
template <typename F, typename Head, typename... Tail>
void variadic_for_each(Head&& head, Tail&&... tail, F f)
{
f(std::forward<Head>(head));
variadic_for_each(std::forward<Tail>(tail)..., f);
}
template <typename... Ts>
void myFunc(Ts&&... vs)
{
variadic_for_each(std::forward<Ts>(vs)..., [](auto&& v)
{
// loop body
});
}