C++用于打印任意数量参数的函数

Ban*_*ski -1 c++ variadic-functions

我遇到了下面用C++编写的这个函数.trace()使用任意数量的参数调用函数会打印每个参数的值以及格式中参数的名称

name1:value1 | name2:value2等等.

我想了解这段代码是如何工作的,什么有的像双&符号的语法&&,__VA_ARGS__意思.谢谢!

#define tr(...) trace(#__VA_ARGS__, __VA_ARGS__)

template <typename Arg1>
void trace(const char* name, Arg1&& arg1){
    cout << name << " : " << arg1 << endl;
}

template <typename Arg1, typename... Args>
void trace(const char* names, Arg1&& arg1, Args&&... args){
    const char* comma = strchr(names + 1, ',');
    cout.write(names, comma-names) << " : " << arg1 << " | " ; 

    trace(comma+1, args...);
}
Run Code Online (Sandbox Code Playgroud)

Tre*_*key 5

#define tr(...) trace(#__VA_ARGS__, __VA_ARGS__)
Run Code Online (Sandbox Code Playgroud)

是一个接受可变数量参数的函数宏.
它将字符串化版本转发为第一个参数.
没有使用预处理器就无法派生字符串表示.

示例评估:

int main(){
    int i;
    float f;
    std::string s;
    tr(i,f,s);
}
Run Code Online (Sandbox Code Playgroud)

解析为:

int main(){
    int i;
    float f;
    std::string s;
    trace("i,f,s", i,f,s);
}
Run Code Online (Sandbox Code Playgroud)

两个可变参数模板函数展开每个参数并以递归方式调用自身.

结束递归的基本案例函数是:

template <typename Arg1>
void trace(const char* name, Arg1&& arg1){
    cout << name << " : " << arg1 << endl;
}
Run Code Online (Sandbox Code Playgroud)

这可以通过折叠表达式更干净地完成.

&&用于允许完美转发.