我想知道,当我创建一个类模板的实例与指定模板类型参数。
1)为什么不叫功能没有得到instatiated? 。
2)不要他们得到编译,直到我尝试使用它?
3)这背后的行为逻辑?
例
template <class T>
class cat{
public:
T a;
void show(){
cout << a[0];
}
void hello(){
cout << "hello() get called \n";
}
};
int main(){
cat<int> ob1; // I know that show() did not get instatiated, otherwise I will get an error since a is an int
ob1.hello();
}
如果他们实例化的整个类,那么你可能会得到无效的代码。
你并不总是希望出现这种情况。
为什么? 因为在C ++中,这是困难的 (在某些情况下,完全不可能,因为据我所知)说,“只有编译此代码,如果X,Y和Z是真实的”。
例如,你会怎么说,“只有我的拷贝构造函数,如果嵌入对象可以复制”? 据我所知,你不能。
因此,他们只是让他们无法编译,除非你真正给他们打电话。
模板是不是代码 - 它们是用来做的实际代码的模式。 直到您提供的参数,这样的代码不能进行提前模板是不完整的。 如果你不调用函数与一组特定的模板参数,代码永远不会被生成。
要润多一点:这通常称为鸭打字 ,而底线是,它可以让你写“类模式”,其中当与一个模板类型实例化的一些成员函数可以申请,当与实例化的其他成员可申请第二模板类型,并且只需要你实际调用编译的,你写为被清盘常见的操作少了很多代码。
如果不要求所有成员函数编译你静态类型的所有细微之处的实际编译功能检查。
例如,假设你有:
template <typename E>
class myContainer {
// Imagine that constructors, setup functions, etc. were here
void sort(); // this function might make sense only if E has an operator< defined
E max(); // compute the max element, again only makes sense with a operator<
E getElement(int i); // return the ith element
E transmogrify(); // perhaps this operation only makes sense on vectors
};
然后,你必须
// sort() and getElement() makes total sense on this, but not transmogrify()
myContainer<int> mci;
// sort and max might not be needed, but getElement() and transmogrify() might
myContainer<vector<double>> mcvd;
无码为生成cat<int>::show()
因为你永远不调用它。 如果你没有调用它,你会得到一个编译错误。 模板功能,这从来不被称为是不存在的。
模板是比测试替代机制而已。 这使得他们非常强大。 你,作为程序员,可能需要创建一个cat<int>
知道你将永远不会调用show()
或拨打其他任何将是无效的。 编译器可以让你知道,如果你做了,所以它工作地非常好。
所以,如果你的问题是“为什么它以这种方式工作”,我会问你“为什么不”? 这是一个设计选择。 这种选择可以让我放心地使用模板类型,仍然从代码的其他部分受益。 有什么危害? 您也产生更少的代码,这是一件好事,对吧?