Why would there be such a requirement for different arguments of the same template parameter?
在他的新书671页中,斯特劳斯鲁普先生写了以下句子:
Note that there is no requirement that different arguments for the
same template parameter should be related by inheritance.
号
我能理解作者写了什么,但我不明白他为什么在文章中插入这个评论。我想我错过了一些东西,但我不知道到底是什么。
如果我们从一个对模板概念完全陌生的人的角度来看待模板的用例,那么答案很简单。
1 2 3 4 5 6 7 | int i; double d; char c; print(&i); //prints an integer print(&d); //prints a double print(&c); //prints a char |
从不理解C++模板的人的角度来看,他/她会假设EDCOX1的原型0看起来是这样的。
1 2 3 | print(SomeBaseType* pdata); OR print(void* pdata); |
号
但是,使用模板所发生的情况是使用函数模板,例如
1 2 | template <typename T> print(T* pdata); |
对于上述用例,编译器在编译期间生成三个函数
1 2 3 | print(int* pdata); print(double* pdata); print(char* pdata); |
。
通过函数重载解析,调用正确的函数。
谢谢你的阅读。
免责声明:打印函数可能不是最好的例子。
在介绍模板的概念时,他试图澄清模板并不是某种多道手术。
在模板被创建并添加到C++之前,只能使用继承(或多字节继承)编写泛型代码。
stroustrup先生当然希望读者不要混淆模板的另一个概念是接口。例如,在Java COMUNITY中,这是一种非常流行的技术,许多书都是OOP解释这个概念的。接口允许在定义类以实现(而不是继承)特定接口的条件下,对类使用某种通用代码。所有使用接口的类都必须与它相关。严格来说,这不是继承,但它是多重继承的一种替代品。
模板可以与任何对象或类一起使用,而不必事先将其类型与任何公共内容相关联。