void log(){} template<typename First, typename ...Rest> void infof(First & first, const Rest & ...rest) { std::cout << head << ""; log(rest...); } 以上代码编译时报错为"Def.h: In instantiation of ‘void infof(First&, const Rest& ...) [with First = const char [2]; Rest = {char [3], char [3], char [1]}]’: main.cpp:9:27: required from here Def.h:16:8: error: too many arguments to function ‘void log()’ log(rest...); ~~~^~~~~~~~~",这是什么原因,应该怎样修改实现对std::cout的变参数封装?
时间: 2024-02-27 14:59:03 浏览: 27
这个错误是因为 log() 函数没有定义任何参数,但在 infof() 函数中调用了 log(rest...),也就是说将 Rest 中的参数传递给了 log() 函数,导致了参数过多的错误。
要实现对 std::cout 的变参数封装,可以将 log() 函数修改为可变参数模板函数,代码如下:
```
template<typename T>
void log(T t) {
std::cout << t;
}
template<typename First, typename ...Rest>
void log(First first, const Rest& ...rest) {
std::cout << first;
log(rest...);
}
template<typename First, typename ...Rest>
void infof(const First& first, const Rest& ...rest) {
std::cout << first;
log(rest...);
}
```
在这个实现中,log() 函数被重载为两个版本。第一个版本接受一个参数,将其输出到 std::cout 中;第二个版本接受一个参数和一个可变参数模板包,将第一个参数输出到 std::cout 中,然后递归调用 log() 函数,将可变参数模板包中的参数依次输出到 std::cout 中。
使用这个实现,可以调用 infof() 函数,将多个参数输出到 std::cout 中。例如:
```
infof("The answer is ", 42, ".", " The meaning of life is ", 42, ".");
```
输出结果为:
```
The answer is 42. The meaning of life is 42.
```