我想要一个模板类型作为模板类型:
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
将是包含2个元素的double
数组。
所以,我想从传递给foo的模板化类中提取模板参数。
我该怎么做?
答案 0 :(得分:4)
您提供的模板声明采用所谓的模板模板参数(模板类型的模板参数)。然而,您提供的使用示例尝试将“普通”类作为参数传递(一旦所有模板参数都修复,模板类变为“普通”类,它就不再是模板)。
这立即意味着模板模板参数不是您所需要的。模板模板参数用于完全不同的目的。 (我不会在这里详述)。
您的问题的一个可能解决方案是要求参数类通过嵌套类型和常量公开其模板参数。即您的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
并强制该用户更新其参数类的定义。