gpt4 book ai didi

c++ - 可变参数模板示例

转载 作者:可可西里 更新时间:2023-11-01 14:52:32 26 4
gpt4 key购买 nike

考虑以下代码,我不明白为什么必须定义 print 的空函数。

#include <iostream>
using namespace std;

void print()
{
}

template <typename T, typename... Types>
void print (const T& firstArg, const Types&... args)
{
cout << firstArg << endl; // print first argument
print(args...); // call print() for remaining arguments
}

int main()
{
int i=1;
int j=2;
char c = 'T';
print(i,"hello",j,i,c,"word");

}

最佳答案

正确的方法:

可变参数模板与归纳法密切相关,这是一个数学概念。

编译器解析下面的函数调用

print('a', 3, 4.0f);

进入

std::cout<< 'a' <<std::endl;
print(3, 4.0f);

分解为

std::cout<< 'a' <<std::endl;
std::cout<< 3 <<std::endl;
print( 4.0f);

分解为

std::cout<< 'a' <<std::endl;
std::cout<< 3 <<std::endl;
std::cout<< 4.0f <<std::endl;
print();

此时它搜索匹配为空函数的函数重载。

  • 所有具有 1 个或多个参数的函数都与可变参数模板匹配
  • 所有没有参数的函数都匹配到空函数

罪魁祸首是对于每种可能的参数组合,您必须只有一个函数。


错误 1:

执行以下操作会出错

template< typename T>
void print( const T& arg) // first version
{
cout<< arg<<endl;
}

template <typename T, typename... Types>
void print (const T& firstArg, const Types&... args) // second version
{
cout << firstArg << endl; // print first argument
print(args...); // call print() for remaining arguments
}

因为当您调用 print 时,编译器不知道要调用哪个函数。

print(3) 是指“第一”还是“第二”版本?两者都是有效的,因为第一个有 1 个参数,第二个也可以接受一个参数。

print(3); // error, ambiguous, which one you want to call, the 1st or the 2nd?

错误 2:

下面无论如何都会出错

// No empty function

template <typename T, typename... Types>
void print (const T& firstArg, const Types&... args)
{
cout << firstArg << endl; // print first argument
print(args...); // call print() for remaining arguments
}

其实如果不用编译器单独使用就可以了

 print('k', 0, 6.5);

分解为

 std::cout<<'k'<<std::endl;
print(0, 6.5);

分解为

 std::cout<<'k'<<std::endl;
std::cout<< 0 <<std::endl;
print( 6.5);

分解为

 std::cout<<'k'<<std::endl;
std::cout<< 0 <<std::endl;
std::cout<< 6.5 <<std::endl;
print(); //Oops error, no function 'print' to call with no arguments

如您在上次尝试中所见,编译器尝试调用不带参数的 print()。但是,如果这样的函数不存在,则不会调用它,这就是为什么您应该提供该空函数(不用担心,编译器会优化代码,因此空函数不会降低性能)。

关于c++ - 可变参数模板示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37298393/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com