C++ 嵌套模板类型
我希望模板类型必须是模板类型:C++ 嵌套模板类型,c++,templates,types,C++,Templates,Types,我希望模板类型必须是模板类型: template < template < int beta, typename gamma> class alpha > gamma foo() { // do stuff with beta, gamma gamma c[beta]; alpha a(); alpha b(); } template 伽玛·福() { //用beta和gamma做些事情 γc[beta]; αa(); αb(); }
template < template < int beta, typename gamma> class alpha >
gamma foo()
{
// do stuff with beta, gamma
gamma c[beta];
alpha a();
alpha b();
}
templateclass alpha>
伽玛·福()
{
//用beta和gamma做些事情
γc[beta];
αa();
αb();
}
我想让gamma和beta由我给出的值决定,所以:
foo< hello<2,double> >()
foo()
将创建一个hello
对象而不是alpha
,并且c
将是一个包含两个元素的double
数组
因此,我想从传递给foo的模板类中提取模板参数
如何执行此操作?您提供的模板声明采用所谓的模板参数(模板类型的模板参数)。然而,您提供的用法示例尝试将“普通”类作为参数传递(一旦所有模板参数都固定,模板类将变成“普通”类,它不再是模板) 这立即意味着模板参数不是您所需要的。模板参数的用途完全不同。(这里我不详细介绍) 问题的一个可能解决方案是要求参数类通过嵌套类型和常量公开其模板参数。也就是说,您的
hello
模板必须包含嵌套常量beta_值
和嵌套类型名gamma_类型
template <int BETA, typename GAMMA> class hello
{
public:
static const int beta_value = BETA;
typedef GAMMA gamma_type;
...
};
模板类你好
{
公众:
静态常数intβ值=β;
typedef伽马型;
...
};
在这种情况下,将使用普通类型模板参数声明函数
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();
}
template typename ALPHA::gamma_type foo()
{
//用beta和gamma做些事情
类型名称ALPHA::gamma_类型c[ALPHA::beta_值];
αa();
αb();
}
如果某些用户忘记遵守约定,编译器将拒绝编译
foo
,并强制该用户更新其参数类的定义。您提供的模板声明采用所谓的模板参数(模板类型的模板参数)。然而,您提供的用法示例尝试将“普通”类作为参数传递(一旦所有模板参数都固定,模板类将变成“普通”类,它不再是模板)
这立即意味着模板参数不是您所需要的。模板参数的用途完全不同。(这里我不详细介绍)
问题的一个可能解决方案是要求参数类通过嵌套类型和常量公开其模板参数。也就是说,您的hello
模板必须包含嵌套常量beta_值
和嵌套类型名gamma_类型
template <int BETA, typename GAMMA> class hello
{
public:
static const int beta_value = BETA;
typedef GAMMA gamma_type;
...
};
模板类你好
{
公众:
静态常数intβ值=β;
typedef伽马型;
...
};
在这种情况下,将使用普通类型模板参数声明函数
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();
}
template typename ALPHA::gamma_type foo()
{
//用beta和gamma做些事情
类型名称ALPHA::gamma_类型c[ALPHA::beta_值];
αa();
αb();
}
如果某些用户忘记遵守约定,编译器将拒绝编译
foo
,并强制该用户更新其参数类的定义。问题不清楚。另外,alpha a()代码>声明函数而不是对象。你真的是这个意思吗?我被你代码片段中的1和后面代码片段中的2弄糊涂了。你可能有输入错误?alpha是一个模板类,你想在函数中提取alpha的模板参数,这就是你想要的吗?@iammilind alpha是类型,a()是构造函数,对吗?@weidi:是的!,这正是我想要的。问题不清楚。另外,alpha a()代码>声明函数而不是对象。你真的是这个意思吗?我被你代码片段中的1和后面代码片段中的2弄糊涂了。你可能有输入错误?alpha是一个模板类,你想在函数中提取alpha的模板参数,这就是你想要的吗?@iammilind alpha是类型,a()是构造函数,对吗?@weidi:是的!,这正是我想要的。