当需要根据类型重载一个函数的时候,可以在函数定义的时候只写形参类型,不写形参变量名。
这样能够正常重载,可读性更明确,说明这个函数只是因为类型而重载,跟其中的值无关。
<pre name="code" class="cpp">using namespace std;
struct FuckAaa {};
struct FuckBbb {};
void func(int base, FuckAaa){
cout << "fuckAaa : " << base + 10 << endl;
}
void func(int base, FuckBbb){
cout << "fuckBbb : " << base + 20 << endl;
}
int _tmain(int argc, _TCHAR* argv[])
{
FuckAaa fuckAaa;
FuckBbb fuckBbb;
func(0, fuckAaa);
func(0, fuckBbb);
getchar();
return 0;
}
- 模板类内部定义了模板成员函数或者嵌套的成员模板类。在模板中,当引用这样的模板成员函数或嵌套的成员模板类时,可以在
::
(作用域解析)运算符、.
(以对象方式访问成员)运算符、->
(以指针方式访问成员)运算符之后使用template关键字,随后才是模板成员函数名字或嵌套的成员模板类名字,这使得随后的左尖括号<
被解释为模板参数列表的开始,而不是小于号运算符。C++11起,这一用途也可以出现在模板以外,尽管此时template
关键字不是必要的。例如:
class A { public: template <class U> class B{ public: typedef int INT; }; template <class V> void foo(){} }; template <typename T> int f() { typename T::template B<double>::INT i; //在VS中加入template会让后面的类名变色,但是无法跳转的定义,去掉template后则相反 i=101; T a, *p=&a; a.template foo<char>(); p->template foo<long>(); return 0; } int main() { f<A>(); A::B<double>::INT i; // 自C++11起,也可写作typename A::template B<double>::INT i; }