最近学了模板实参推断与函数指针的一些知识,觉得有些东西可以写下来与大家分享。这是我的第一篇博客,不足之处请大家指针O(∩_∩)O
首先上代码:
#include<iostream>
#include<string>
using namespace std;
template <class T>
T add(const T &v1,const T &v2)
{
return (v1+v2);
}
int main()
{
int (*pf1) (const int&, const int&) = add;
cout<<add(1.2,1.3)<<endl;
cout<<pf1(1.2,1.3)<<endl;
getchar();
return 0;
}
输出是
2.5
2
也许有人会问为什么pf1也是指向add函数的,输出却不一样呢。其实,大家再仔细看看就知道了,pf1是一个指向“接受两个 const int& 类型形参并返回 int值的函数”的指针。形参的类型决定了 T 的模板实参的类型, 因此T 的模板实参为 int 型,指针 pf1 引用的是将 T 绑定到 int 的实例化。也就是说这里当你使用pf1时,就意味着你已经确定了模板实参的类型。
下面我我们将程序稍作修改
#include<iostream>
#include<string>
using namespace std;
template <class T>
T add(const T &v1,const T &v2)
{
return (v1+v2);
}
int main()
{
float (*pf1) (const float&, const float&) = add;
cout<<add(1.2,1.3)<<endl;
cout<<pf1(1.2,1.3)<<endl;
getchar();
return 0;
}
输出显而易见
2.5
2.5
再看
#include<iostream>
#include<string>
using namespace std;
template <class T0,class T>
T0 add(const T &v1,const T &v2)
{
return (v1+v2);
}
int main()
{
int (*pf1) (const float&, const float&) = add;
cout<<add<int>(1.2,1.3)<<endl;
cout<<pf1(1.2,1.3)<<endl;
getchar();
return 0;
}
这里的输出是
2
2
道理也很简单,这里也不多说了。其实我们只要记得当使用函数指针参加模板实参推断时,我们要关注的是指针指向的是怎么样的一个函数(什么类型的参数,什么类型的返回值),当然其实我还是觉得不用能不用函数指针就不用函数指针为好,哈哈。!