template<typename Tag, typename Tag::type M>
struct Rob {
friend typename Tag::type get(Tag) {
return M;
}
};
我从 Johannes Schaub 的博客中获取了这段代码,我以前从未见过用于第二个模板参数的语法。什么"Tag::type M"
意思?
只要它们是编译时常量,就可以有非类型模板参数。也就是说,你可以有类似的东西
template <int M> ...
现在,让非类型模板参数的类型依赖于另一个模板参数的嵌套类型可能是合理的:
template <typename T, typename T::type M> ...
该部分typename T::type
声明它type
是一种类型,并且指定的模板参数属于这种类型。一个更具体的例子是
template <typename T, typename T::size_type S> ...
当使用容器类型实例化时,S
将是容器的size_type
.
在这种情况下,这意味着 typenameTag
为自己定义了一个 typename,称为Tag::type
. 如果您在其中定义类型(或静态变量/函数),则类可以充当名称空间,这就是您::
在此处使用名称的原因,就像您拥有名称空间一样。
你的例子相当于
<typename MyFirstType, typename MyFirstType::type MySecondType>