带有一个模板参数的C ++模板类类型声明

时间:2018-03-06 17:47:37

标签: c++ templates

我遇到了下面的声明

template <class charT, class traits = char_traits<charT> >
class basic_istream;

我的疑问是:依赖class traits = char_traits<charT>部分的目的是什么,当我们只用

声明整个事情时
template <class charT, class traits >

如果使用后者我们确认允许任何类型作为第二个模板参数,那么我们为什么要选择另一个?

3 个答案:

答案 0 :(得分:0)

是的,你可以。

 basic_istream<char, char_traits<char> >;

答案 1 :(得分:0)

当你说

template<class T = Something>

使用默认参数声明模板参数T - 也就是说,可以提供或不提供参数。如果未提供,则使用Something。但你仍然可以明确地提供它,使其成为别的东西。

所以声明

template <class charT, class traits = char_traits<charT> >
class basic_istream;

basic_istream的作者允许您声明类似basic_istream<SomeCharT>的内容,而不必费心提供第二个模板参数,并为您计算合理的参数。但如果你愿意,他们仍允许你说basic_istream<SomeCharT, SomeOtherCharTraits>

答案 2 :(得分:0)

  

通过取消上述类型,我们确认允许任何类型,那么我们为什么要选择其他类型

在这两种情况下,我们允许第二个模板参数(traits)的任何类型,但在第一种情况下,如果未表达的第二个类型,我们也给出一个默认值。

所以,定义,

template <typename A, typename B = int>
class foo;

类型为foo<std::string, int>的对象可以通过以下两种方式声明

foo<std::string>       f0;
foo<std::string, int>  f1;

如果您声明foo没有第二个模板参数的默认值

template <typename A, typename B>
class foo;

您只能声明一个foo对象来解释两个模板参数

// foo<std::string>       f0; <-- error now
foo<std::string, int>  f1;