令人困惑的模板代码

时间:2011-10-07 23:21:12

标签: c++ templates

以下是什么意思

template < template < template < class > class, class > class Param >

我从未使用过template <template <X>>种语法

得到了另一个website

template < template < template < class > class, class > class Param >
struct Bogus {


int foo() {
printf("ok\n");;
}
};

欣赏这种语法的任何亮点。谢谢

更新:看起来已经存在一些解释,请参阅下面的杰瑞解决方案

2 个答案:

答案 0 :(得分:5)

答案 1 :(得分:3)

C ++中有三个本体层: values types templates

模板实例化是一种类型。对象是某种类型的 一个值。

所有三种实体都可以显示为模板参数:

template <int N, typename T, template <typename> C>
{
  C<T> array[N];
};

该参数按此顺序分类为“非类型模板参数”,“模板参数”和“模板模板参数”(我认为)。

拥有模板参数非常有用,例如,如果您想允许在任意容器上进行参数化(特别是使用可变参数模板!):

template <typename T, template <typename...> Container>
void print(const Container<T> & c)
{ /* ... */ }

顺便提一下,当一个类模板包含成员时,你必须分别使用单词typenametemplate来根据它们的性质来解决它们(没有任何意思是你想要引用的):

template <typename T> struct Foo
{
  T value;
  typedef T * pointer;
  template <typename S> struct Nested;
};

// now refer to them as:
Foo<T>::value;
typename Foo<T>::pointer;
template<typename S> Foo<T>::template Nested<S>;