C++已经"known"的模板参数

C++ template argument which is already "known"

本文关键字:参数 known 已经 C++      更新时间:2023-10-16

这个问题可能回答得很好,但不幸的是,我不知道正确的术语来问它,所以…

template <class _Cp, bool _IsConst, typename _Cp::__storage_type = 0> class __bit_iterator;

有人能解释一下最后一个模板论点吗?我唯一能推断的是,如果为_Cp指定的参数有一个子类型__storage_type,那么在模板中使用_Cp::__storagetype都会解决这个问题。如果不是,那么这是否意味着_Cp::__storage_type解析为0?这在我看来真的很反常(或者经过一点实验后可能是错误的)。

请提供解释以及正确的术语和C++参考。

出于兴趣,这段代码是从libc++中提取的。

类模板__bit_iterator接受三个参数:

  • _Cp
  • 布尔_IsConst
  • 类型为_Cp::__storage_type(可能是一个整数)的对象,没有命名
    • 该参数是可选的,默认为表达式0

第三个参数(因为它是未命名的,因此不能在__bit_iterator的定义中使用)的目的似乎只是要求类_Cp具有与表达式0兼容的成员类型__storage_type。如果没有,则该实例化(使用_Cp)将无法编译。

template <class _Cp, bool _IsConst, typename _Cp::__storage_type = 0>
class __bit_iterator;

__bit_iterator是一个类模板。此模板包含三个参数。

  1. _Cp,它是一种类型。

  2. _IsConst,它是一个布尔值。

  3. 最后一个参数是未命名的,是一个值(就像_IsConst一样)。此参数的类型是在_Cp中声明的Type/typedef,并命名为__storage_type

如果您被typename关键字弄糊涂了:typename是一种指示依赖名称是类型的方法。

_Cp是模板参数,可以是任何类型。即使是一个类型,也不包含任何类似__storage_type的内容。这就是为什么我们必须告诉编译器,这样的东西应该存在,并且是type/typedef。如果不满足此要求,将引发编译时错误。

template <class _Cp, bool _IsConst, typename _Cp::__storage_type = 0> 
class __bit_iterator;

这看起来像是一个非类型模板参数(与以前的_IsConst参数没有不同),如果不是用户提供的,则使用0进行初始化。该模板的一个可能的专业化可能是:

struct X { typedef int __storage_type; };
__bit_iterator<X, false> bi;

这相当于:

__bit_iterator<X, false, X::__storage_type(0)> bi;

其实际上等效于(因为X::__storage_typeint):

__bit_iterator<X, false, 0> bi;