2

我想要求模板类型是模板类型:

template < template < int beta, typename gamma> class alpha >
gamma foo()
{
    // do stuff with beta, gamma
    gamma c[beta]; 
    alpha a();
    alpha b();
}

我想让 gamma 和 beta 由我给出的值决定,所以:

foo< hello<2,double> >()

将创建一个hello<2,double>对象而不是alpha,并且c将是一个double包含 2 个元素的数组。

所以,我想从传递给 foo 的模板类中提取模板参数。

我该怎么做?

4

1 回答 1

4

您提供的模板声明采用所谓的模板模板参数(模板类型的模板参数)。然而,您提供的使用示例尝试将“普通”类作为参数传递(一旦所有模板参数都固定,模板类就会变成“普通”类,它不再是模板)。

这立即意味着 template-template 参数不是您所需要的。模板-模板参数用于完全不同的目的。(我不会在这里详细介绍)。

您的问题的一种可能解决方案是要求参数类通过嵌套类型和常量公开其模板参数。即你的hello模板必须包含一个嵌套的常量beta_value和嵌套的类型名gamma_type

template <int BETA, typename GAMMA> class hello 
{
public:
  static const int beta_value = BETA;
  typedef GAMMA gamma_type;
  ...
};

在这种情况下,您的函数将使用普通类型模板参数声明

template <typename ALPHA> typename ALPHA::gamma_type foo()
{
   // do stuff with beta, gamma
   typename ALPHA::gamma_type c[ALPHA::beta_value]; 
   ALPHA a();
   ALPHA b();
}

如果某些用户忘记遵守约定,编译器将拒绝编译foo并强制该用户更新其参数类的定义。

于 2012-07-03T05:00:29.480 回答