Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 什么';C+中的sva_arg()+;11变量模板?_C++_Templates_C++11_Clang_Variadic Templates - Fatal编程技术网

C++ 什么';C+中的sva_arg()+;11变量模板?

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... }

我读过一些关于这个新的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...
    }
}
模板
无效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
    });
}