类型推导不是重点内容,大家知道类型推导是怎么个事即可!
想必大家都用过auto
这个非常受欢迎的关键字吧,「通常情况下,遇到类型复杂的变量,直接无脑auto」。
百度百科关于auto的介绍如下: 在C++中,auto关键字用于自动类型推断。它允许编译器根据初始化表达式自动推断变量的类型,从而使得代码更加简洁和易于维护。auto的使用场景包括但不限于循环中的迭代器、复杂类型(如std::map、std::vector等容器的元素类型)的声明,以及函数返回类型推导(在C++11之后的版本中)。
但是有时候我们也有推导出该变量是什么类型的需求。推导的过程就是类型推导 如下:
int main()
{
auto it = [](int a, int b)->int {return a + b; };
cout<<typeid(it).name();
}
运行结果如下:
其中我们用到了一个函数:typeid
下面👇我们有必要好好介绍一下typeid
在C++中,typeid是一个运算符,用于获取一个表达式的类型信息。它返回一个std::type_info对象,该对象包含有关该表达式的类型信息。typeid通常与auto关键字结合使用时,可以帮助开发者在运行时确定由auto推导出的变量的具体类型。
typeid的基本用法 typeid运算符的返回结果是名为type_info的标准库类型的对象的引用(在头文件typeinfo中定义)。type_info类提供了一个成员函数name(),它返回一个C风格的字符串,用来表示相应的类型名。但需要注意的是,这个返回的类型名与程序中使用的相应类型名并不一定一致,具体格式可能因编译器而异。
前面文章中,我们介绍了函数模板和类模板,今天我们将函数模板和类型推导结合起来
template<class T>
void func1(T a)
{
cout << typeid(T).name() << endl;
}
我们用一个函数试一下,看看是可以推导出来该函数的返回值类型和参数类型。
int sum(int a, int b)
{
return a + b;
}
int main()
{
func1(sum);
}
结果如下:
但是这个结果力度太大,我就行推导出返回值类型就可以了,解决方案就是部分特例化模板。
针对需求,我们可以这样做:
template<class R,class A1,class A2>
void func2(R(*a)(A1, A2))
{
cout << typeid(R).name() << endl;
cout << typeid(A1).name() << endl;
cout << typeid(A2).name() << endl;
}
借用上面👆的代码检验一下是否可以推导成功
Nice,结果正确,成功推出!