奇怪的模板参数语法

时间:2012-10-20 22:03:28

标签: c++ templates

template<typename Tag, typename Tag::type M>
struct Rob { 
  friend typename Tag::type get(Tag) {
    return M;
  }
};

我从Johannes Schaub的博客中获取此代码,我从未见过用于第二个模板参数的语法。 "Tag::type M"是什么意思?

2 个答案:

答案 0 :(得分:2)

只要它们是编译时常量,就可以使用非类型模板参数。也就是说,你可以拥有像

这样的东西
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的常量。

答案 1 :(得分:1)

在这种情况下,这意味着typename Tag为自己定义了一个类型名称,称为Tag::type。如果您在其中定义类型(或静态变量/函数),则类可以充当命名空间,这就是您在此处使用::的原因,就像您拥有命名空间一样。

您的示例等同于

<typename MyFirstType, typename MyFirstType::type MySecondType>