C++已经"known"的模板参数
C++ template argument which is already "known"
这个问题可能回答得很好,但不幸的是,我不知道正确的术语来问它,所以…
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
是一个类模板。此模板包含三个参数。
_Cp
,它是一种类型。_IsConst
,它是一个布尔值。最后一个参数是未命名的,是一个值(就像
_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_type
是int
):
__bit_iterator<X, false, 0> bi;
- 如何反转整数参数包
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 如何使用默认参数等选择模板专业化
- 模板参数替换失败,并且未完成隐式转换
- 具有默认模板参数的多态类的模板推导失败
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 函数调用中参数的顺序重要吗
- 部分定义/别名模板模板参数
- 模板-模板参数推导:三个不同的编译器三种不同的行为
- 使用不带参数的函数访问结构元素
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 如何在OMNET++中指定与命令行参数组合的输出文件名
- 如何使用Luacneneneba API正确读取字符串和表参数
- 在派生函数中指定void*参数
- 视图中的参数推导失败:take_while
- static_assert在宏中,但也可以扩展到可以用作函数参数的东西
- 使用指向成员的指针将成员函数作为参数传递
- C++已经"known"的模板参数
- 将"this"作为参数传递时从 const "No known conversion"