ATL布幔之下的秘密(3)
2006-07-22 22:54:58 来源:WEB开发网核心提示: (20, 30)让我们来稍微修改一下程序35,传递字符串值(而不是int或float)作为参数,ATL布幔之下的秘密(3)(6),并看看结果吧,程序42.#include <iostream>using namespace std;template <typename T
(20, 30)
让我们来稍微修改一下程序35,传递字符串值(而不是int或float)作为参数,并看看结果吧。
程序42.
#include <iostream>
using namespace std;
template <typename T>
T Maximum(T a, T b) {
return a > b ? a : b;
}
int main() {
cout << Maximum("Pakistan", "Karachi") << endl;
return 0;
}
程序的输出为Karachi。(译注:在我的Visual Studio.net 2003下的输出却为Pakistan,这不同的原因是编译器组织字符串地址的方式不同决定的,但是Maximum函数的结果是应该返回内存高位的那个地址的,这和作者说的道理是一致的。)为什么呢?因为这里char*作为模板参数传递, Karachi在内存中存储的位置更高,而>运算符仅仅比较这两个地址值而不是字符串本身。
那么,如果我们希望基于字符串的长度来比较而不是地址的话,应该怎么做呢?
解决的办法是对char*数据类型进行模板的特化。下面是一个模板特化的例子。
程序43.
#include <iostream>
using namespace std;
template <typename T>
T Maximum(T a, T b) {
return a > b ? a : b;
}
template <>
char* Maximum(char* a, char* b) {
return strlen(a) > strlen(b) ? a : b;
}
int main() {
cout << Maximum("Pakistan", "Karachi") << endl;
return 0;
}
至于类模板,也可以用相同的办法进行特化。
程序44.
更多精彩
赞助商链接