我最近拿出下面的图片来解释c ++标头的内容。
在每个类模板上,都附加了实例化,它们之间有什么区别,以及拥有前者的优点是什么。
答案 0 :(得分:2)
实例化普通类时,您将获得该类的对象(或实例)。
class Normal
{
};
Normal Na, Nb; //Na and Nb are instances of the Normal class
实例化一个类模板时,您将获得用作模板参数的类型的类。
简单的示例:
template<typename T>
class PodTemplate {
T a;
}
typedef PodTemplate<int> intClass; //variable `a` in intClass is an int, as the template is instantiated with `typename = int`
typedef PodTemplate<float> floatClass; //variable `a` in floatClass is an float, as the template is instantiated with `typename = float`
类似地,在您显示的图片中,有模板以及这些模板的实例化产生类。
例如,考虑basic_istream
类模板:
template <typename charT, typename traits = char_traits<charT> >
class basic_istream;
使用typename = char
实例化上述模板为我们提供了istream
类。
typedef basic_istream<char> istream;
答案 1 :(得分:1)
cppreference中对此进行了很好的解释。无论如何,您可以通过提供模板参数来实例化模板。例如:
template<
class CharT,
class Traits = std::char_traits<CharT>,
class Allocator = std::allocator<CharT>
> class basic_stringstream;
是一个模板类,它接受3个模板参数(其中2个具有默认值),而basic_stringstream<char>
是带有模板参数char
的模板实例,并具有别名(typedef){{ 1}}。