繁体   English   中英

具有一个更多模板参数的C ++模板类类型声明

[英]C++ template class type declaration with one more template parameter

我遇到了下面的声明

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

我的疑问是:当我们可以用以下命令声明整个内容时,依赖class traits = char_traits<charT>部分的目的是什么?

template <class charT, class traits >

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

是的你可以。

 basic_istream<char, char_traits<char> >;

当你说

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>如果basic_istream<SomeCharT, SomeOtherCharTraits>它们仍然允许您说basic_istream<SomeCharT, SomeOtherCharTraits>

通过清除以上类型,我们确认允许使用任何类型,然后为什么我们要选择其他类型

在这两种情况下,我们都允许第二种模板参数( 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;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM