WEB开发网
开发学院软件开发VC ATL布幔之下的秘密(3) 阅读

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.

上一页  1 2 3 4 5 6 7 8 9 10  下一页

Tags:ATL 之下 秘密

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接