template函数和函数的重载的调用判断
2009-07-25 22:00
176 查看
struct H {};
struct G
{
operator H() const { printf("!!!/n"); return H();}
};
template <class T>
void ff(T, H) //T不用转换,H 转换一次,共一次。T参数满足--当在其他同名函数中没有这个参数的满足的情况下,范型算是满足(共一次)
{
printf("int,T/n");
}
void ff(int, G) //G不用转换,int转换一次,共一次。G参数满足(共一次)
{
printf("int,float/n");
}
short i = 0;
G g;
ff(i, g);
编译错误。因为2个函数都需要转换一次,并且满足的参数次数一致,都一次。所以错误。
调用哪个函数的判断的标准是转换次数的大小。选择次数小的。但是在转换次数一致的情况下会去检查参数的满足次数,选择满足次数多的。(当然,这是在编译器能够推断模板参数的情况下,即可以具现模板函数的情况下)
template <class T>
void ff(T, int) //T不用转换,int转换一次
{
printf("int,T/n");
}
void ff(short, float) //short不用转换,float转换2次
{
printf("int,float/n");
}
short i = 0;
short s = 0;
ff(i, s);
输出int T
再看个例子:
void fffff(float)
{
printf("1111/n");
}
template <class T>
void fffff(int)
{
printf("2222/n");
}
fffff(int());
输出为1111, 为什么不是2222呢,不是int的转换次数小么,的确是int次数小,但是因为编译器推断不出T的类型,所以并不会具现化模板函数,这样就会走非模板的函数,即float.
此外用户定义的转换会先于系统的隐式转换。
struct Convert
{
operator float() const {printf("float/n"); return 1.0;}
operator int() {printf("int/n"); return 1;}
};
void ffff(float)
{
printf("float/n");
}
ffff(Convert());
输出是int float 说明用户转换先于系统转换被调用,因为
operator float() const {printf("float/n"); return 1.0;}要先把Convert->const Convert是属于先系统调用,所以还是
选择int转换。(不过转换次数还是算一次, 即const volatile的转换不算在转换次数里)
struct G
{
operator H() const { printf("!!!/n"); return H();}
};
template <class T>
void ff(T, H) //T不用转换,H 转换一次,共一次。T参数满足--当在其他同名函数中没有这个参数的满足的情况下,范型算是满足(共一次)
{
printf("int,T/n");
}
void ff(int, G) //G不用转换,int转换一次,共一次。G参数满足(共一次)
{
printf("int,float/n");
}
short i = 0;
G g;
ff(i, g);
编译错误。因为2个函数都需要转换一次,并且满足的参数次数一致,都一次。所以错误。
调用哪个函数的判断的标准是转换次数的大小。选择次数小的。但是在转换次数一致的情况下会去检查参数的满足次数,选择满足次数多的。(当然,这是在编译器能够推断模板参数的情况下,即可以具现模板函数的情况下)
template <class T>
void ff(T, int) //T不用转换,int转换一次
{
printf("int,T/n");
}
void ff(short, float) //short不用转换,float转换2次
{
printf("int,float/n");
}
short i = 0;
short s = 0;
ff(i, s);
输出int T
再看个例子:
void fffff(float)
{
printf("1111/n");
}
template <class T>
void fffff(int)
{
printf("2222/n");
}
fffff(int());
输出为1111, 为什么不是2222呢,不是int的转换次数小么,的确是int次数小,但是因为编译器推断不出T的类型,所以并不会具现化模板函数,这样就会走非模板的函数,即float.
此外用户定义的转换会先于系统的隐式转换。
struct Convert
{
operator float() const {printf("float/n"); return 1.0;}
operator int() {printf("int/n"); return 1;}
};
void ffff(float)
{
printf("float/n");
}
ffff(Convert());
输出是int float 说明用户转换先于系统转换被调用,因为
operator float() const {printf("float/n"); return 1.0;}要先把Convert->const Convert是属于先系统调用,所以还是
选择int转换。(不过转换次数还是算一次, 即const volatile的转换不算在转换次数里)
相关文章推荐
- C++语言笔试题目 C++中为什么用模板类&& 类中如何使用const &&函数重载,我们靠什么来区分调用的那个函数?靠返回值判断可以不可以
- JAVA语言的素数判断,随机数,函数调用
- 用函数的调用来判断某年某月有多少天
- C++ 重载调用操作符和函数对象
- 写4个同名方法,实现两个整数、两个实数,一个实数一个整数,一个整数一个实数之间的求和。在主调函数中调用这4个方法计算相关的值。(方法的重载)
- 编译原理扫描程序,判断当前输入的程序中程序调用的函数是那个函数原型
- 函数调用判断一个年份是否为闰年及程序的继续与结束
- C++学习笔记-----在重载的赋值运算函数中调用拷贝构造函数
- system函数返回(如何判断调用的shell命令是否执行成功)
- C++赋值运算符、函数调用运算符、下标运算符(“=”、“()”、“[]”)重载
- javascript 函数调用规则和IF条件判断
- 【c++面试题】c++中函数的重载,c++程序中调用C编译器编译后的函数为什么要加extern "C 4000 "
- 用C++ Variadic Template 和 lambda表达式简化判断函数返回值的语句
- C++ 函数模板(十四)--template 泛型函数模板、通用函数、重载模板
- 第八周 项目 二 有函数的重载运用一般函数进行调用私有用数据
- 函数调用参数判断
- c++的函数的重载原理分析和调用约定
- C++基础学习笔记----第四课(函数的重载、C和C++的相互调用)
- C语言*函数调用* 判断一个数是几位数
- C++ - 函数模板(function template) 的 重载(overload) 详解 及 代码